web-dev-qa-db-ja.com

Linuxでアセンブラーをコンパイル/実行しますか?

私はLinux(Ubuntu 10.04)にかなり慣れていないので、アセンブラーの初心者です。私はいくつかのチュートリアルに従っていましたが、Linuxに特化したものは見つかりませんでした。だから、私の質問は、アセンブラーをコンパイル/実行するのに適したパッケージとは何ですか?また、そのパッケージ用にコンパイル/実行するコマンドラインコマンドは何ですか?

53
Rafe Kettler

GNUアセンブラー(ガス)とNASMは両方とも良い選択ですが、大きな違いは操作とそのオペランドを置く順序です。

gasはAT&T構文を使用します(ガイド: https://stackoverflow.com/tags/att/info ):

mnemonic    source, destination

nasmはIntelスタイルを使用します(ガイド: https://stackoverflow.com/tags/intel-syntax/info ):

mnemonic    destination, source

どちらかがおそらく必要なことを行います。 GASにはIntel構文モードもあります。これはNASMではなくMASMによく似ています。


このチュートリアルを試してください: http://asm.sourceforge.net/intro/Assembly-Intro.html

Stack Overflowのガイドとドキュメントへのリンクもご覧ください x86タグwiki

43
George

GNUアセンブラーはおそらくシステムに既にインストールされています。_man as_を使用して完全な使用情報を確認してください。個々のファイルをコンパイルするにはasを、あなたは本当に、本当にしたい。

ただし、GCCは優れたフロントエンドになります。 .sファイルをアセンブルできます。例えば:

_$ cat >hello.s <<"EOF"
.section .rodata             # read-only static data
.globl hello
hello:
  .string "Hello, world!"    # zero-terminated C string

.text
.global main
main:
    Push    %rbp
    mov     %rsp,  %rbp                 # create a stack frame

    mov     $hello, %edi                # put the address of hello into RDI
    call    puts                        #  as the first arg for puts

    mov     $0,    %eax                 # return value = 0.  Normally xor %eax,%eax
    leave                               # tear down the stack frame
    ret                            # pop the return address off the stack into RIP
EOF
$ gcc hello.s -no-pie -o hello
$ ./hello
Hello, world!
_

上記のコードはx86-64です。位置に依存しない実行可能ファイル(PIE)を作成する場合は、lea hello(%rip), %rdiと_call puts@plt_が必要です。

非PIE実行可能ファイル(position-dependent)は静的データに32ビットの絶対アドレス指定を使用できますが、PIEはRIP相対LEAを使用する必要があります。 ( x86-64でのmovqとmovabsqの違いmovqmovabsqも良い選択ではありません。も参照してください。)

32ビットコードを記述したい場合、呼び出し規約は異なり、RIP相対アドレス指定は使用できません。 (したがって、呼び出しの前に_Push $hello_を実行し、その後にスタック引数をポップします。)


何かがどのように機能するかを知りたい場合は、C/C++コードをアセンブリに直接コンパイルすることもできます。

_$ cat >hello.c <<EOF
#include <stdio.h>
int main(void) {
    printf("Hello, world!\n");
    return 0;
}
EOF
$ gcc -S hello.c -o hello.s
_

GCC/clangアセンブリ出力から「ノイズ」を除去する方法? も参照してください。コンパイラー出力の確認、および興味深い出力にコンパイルされる便利な小さな関数の作成についての詳細。

57
Jay Conrod

NASMを使用している場合、コマンドラインはただ

nasm -felf32 -g -Fdwarf file.asm -o file.o

ここで、「file.asm」はアセンブリファイル(コード)、「file.o」はgcc -m32またはld -melf_i386でリンクできるオブジェクトファイルです。 (nasm -felf64でアセンブルすると64ビットのオブジェクトファイルが作成されますが、以下のhello worldの例では32ビットのシステムコールを使用し、PIE実行可能ファイルでは機能しません。)

詳細は次のとおりです。

http://www.nasm.us/doc/nasmdoc2.html#section-2.1

次のコマンドを使用して、UbuntuにNASMをインストールできます。

apt-get install nasm

食欲をそそるLinuxアセンブリの基本的なHello Worldは次のとおりです。

http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html

私はこれがあなたが尋ねていたものであることを願っています...

20
Justin

Linux用のFASMもあります。

format ELF executable

segment readable executable

start:
mov eax, 4
mov ebx, 1
mov ecx, hello_msg
mov edx, hello_size
int 80h

mov eax, 1
mov ebx, 0
int 80h

segment readable writeable

hello_msg db "Hello World!",10,0
hello_size = $-hello_msg

とコンパイルします

fasm hello.asm hello
8
Artur Artamonov

私の提案は、「Programming From Ground Up」という本を入手することです。

http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf

これは、Linuxでアセンブラープログラミングを始めるための非常に良い出発点であり、開始するために理解する必要がある基本事項の多くを説明しています。

7
gilligan

1つのアセンブラ、yasmに3つの構文(nasm、tasm、gas)。

http://www.tortall.net/projects/yasm/

4
plan9assembler

アセンブラー(GNU)はas(1)

4
Recursion

Ubuntu 18.04install nasmの場合。ターミナルを開き、次を入力します。

Sudo apt install as31 nasm

nasm docs

コンパイルおよび実行の場合:

nasm -f elf64 example.asm # assemble the program  
ld -s -o example example.o # link the object file nasm produced into an executable file  
./example # example is an executable file
1