システムコールにどのレジスタが必要かはどうすればわかりますか?マシンごとに違いますか?それではなぜeax、ebxなどがありますか?私のマシンをどのように見つけることができますか?プロセッサごとに違いますか?つまり、i586とi386の間に違いはありますか?
_start: ; entry point for commands
; use the write syscall to print 'Hello world!' to stdout
mov eax, 4 ; move syscall 4(write) to the eax register
mov ebx, 1 ; move field descriptor for stdout to ebx
mov ecx, msg ; move the memory address of our string to ecx
mov edx, 13 ; move the length of the string to edx
int 0x80 ; execute the syscall
section .data
msg: db “Hello world!”, 0x0a ; the string, followed by a new line character
答え1
各アーキテクチャは基本的に「最初の引数はここに、2番目の引数はここに、3番目の引数はここに行く... .return値はここに返されます」と言う「ABI」(Application Binary Interface)定義します。 ABI仕様を読み、関数引数の順序とサイズを使用して、どのレジスタに入るかを決定します。
ターゲットとするプラットフォームごとに異なるアセンブリを作成する必要があります。しかし、すべての「Linux x86_64」プラットフォームはバイナリ互換性があり、x86、ARM、PowerPCなどでも同様であることは合理的に確信できます。しかし、BSDもあります:-)
以下はx86とx86_64のチートシートです(クイックGoogle検索)。
しかし、また注目すべきことシステムコール番号自体はプラットフォームごとに異なります。したがって、「open」はx86_64では3ですが、x86では5です.