私はLinux(Ubuntu 10.04)にかなり慣れていないので、アセンブラーの初心者です。私はいくつかのチュートリアルに従っていましたが、Linuxに特化したものは見つかりませんでした。だから、私の質問は、アセンブラーをコンパイル/実行するのに適したパッケージとは何ですか?また、そのパッケージ用にコンパイル/実行するコマンドラインコマンドは何ですか?
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
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の違いmovq
もmovabsq
も良い選択ではありません。も参照してください。)
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アセンブリ出力から「ノイズ」を除去する方法? も参照してください。コンパイラー出力の確認、および興味深い出力にコンパイルされる便利な小さな関数の作成についての詳細。
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
私はこれがあなたが尋ねていたものであることを願っています...
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
私の提案は、「Programming From Ground Up」という本を入手することです。
http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf
これは、Linuxでアセンブラープログラミングを始めるための非常に良い出発点であり、開始するために理解する必要がある基本事項の多くを説明しています。
1つのアセンブラ、yasmに3つの構文(nasm、tasm、gas)。
アセンブラー(GNU)はas(1)
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