一般的なアドバイス:
「x86アセンブラ」だけではありません。各アセンブラは少し異なり、一般的に相互に互換性はありません。NASMアセンブラは、広く使用されており、インストールが簡単で、64ビットアセンブリをサポートしているため、私はNASMアセンブラをお勧めします。
x86アセンブラーに関する優れた本を読んで、基本(レジスター、条件付きジャンプ、算術など)の感触をつかんでください。始めたとき、ランドール・ハイドのアート・オブ・アセンブリーを読みました。
http://asm.sourceforge.netには、作業したいチュートリアルがいくつかあるようです。ただし、64ビットモードでアセンブルする場合は、C関数とsyscallの呼び出し規約が異なることに注意してください。
CPUリファレンスマニュアルが必要になります。個人的には、AMDのものが好きです。CPUマニュアルのボリューム1と3が必要です。他の巻も興味深いかもしれません。
64ビット固有のアドバイス
64ビットx86アセンブリは32ビットx86アセンブリとほぼ同じです。これは、64ビットx86が32ビットとほとんど下位互換性があるためです。64ビットレジスタと他のいくつかの機能にアクセスできます。一部のあいまいな命令は無効になり、残りは32ビットと同じです。
ただし、システムコールの規則は64ビットLinuxでは完全に異なります。カーネルによっては、32ビットのシステムコールが利用できる場合とできない場合があります。さらに悪いことに、64ビットの呼び出し規約は十分に文書化されていません。私はそれをglibcソースコードの深さを調べることによってのみ理解しました。
これを難しい方法で見つける手間を省くために、syscall番号はLinuxのソースコードの下にありarch/x86/include/asm/unistd_64.h
ます。システムコール番号はrax
レジスタに渡されます。パラメータは、、、、、、、rdi
にrsi
あります。呼び出しは命令で呼び出されます。レジスタを上書きします。リターンはにあります。(簡単な例はここにあります。)rdx
r10
r8
r9
syscall
syscall
rcx
rax