システムコールにどのレジスタが使用されているかを確認するには? [閉鎖]

システムコールにどのレジスタが使用されているかを確認するには? [閉鎖]

システムコールにどのレジスタが必要かはどうすればわかりますか?マシンごとに違いますか?それではなぜ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仕様を読み、関数引数の順序とサイズを使用して、どのレジスタに入るかを決定します。

バラよりhttps://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64

ターゲットとするプラットフォームごとに異なるアセンブリを作成する必要があります。しかし、すべての「Linux x86_64」プラットフォームはバイナリ互換性があり、x86、ARM、PowerPCなどでも同様であることは合理的に確信できます。しかし、BSDもあります:-)

以下はx86とx86_64のチートシートです(クイックGoogle検索)。

しかし、また注目すべきことシステムコール番号自体はプラットフォームごとに異なります。したがって、「open」はx86_64では3ですが、x86では5です.

関連情報