私に悩まされる1つの質問があります。なぜアセンブリx86_64 syscallのパラメータはi386のようにアルファベット順ではありません
そう... x86_32は私が感じるのレジスタで渡されパラメータににあるアルファベット順に(eax
、ecx
、edx
、esi
)とが順にランクなぜ(esi
、edi
を、ebp
)
+---------+------+------+------+------+------+------+
| syscall | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 |
+---------+------+------+------+------+------+------+
| %eax | %ebx | %ecx | %edx | %esi | %edi | %ebp |
+---------+------+------+------+------+------+------+
section .text
global _start
_start:
mov eax, 1 ; x86_64 opcode for sys_exit
mov ebx, 0 ; first argument
int 0x80
x86_64版でシステムコールのパラメータはパスですが少しランダムが配置さを見て、レジスタに編:
+---------+------+------+------+------+------+------+
| syscall | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 |
+---------+------+------+------+------+------+------+
| %rax | %rdi | %rsi | %rdx | %r10 | %r8 | %r9 |
+---------+------+------+------+------+------+------+
section .text
global _start
_start:
mov eax, 1 ; x86_64 opcode for sys_exit
mov edi, 0 ; first argument
syscall
彼らは、特定の理由であることをしましたか?私はここに何か見ていないのですか?
x86-64では、これは関数呼び出し規約と一致し、syscallラッパー関数は軽量です。 i386では、IDKはなぜその不便な設定を使用するのですか( 'ebx'は呼び出し保存されているので、ほとんどのsyscallラッパーはebxを保存/復元する必要があります) –
@PeterCordesそして関数呼び出し規約は、 'memcpy'に' rep movsb'を実装しています。 – fuz
関数呼び出し規約?多分私はルーキーのように聞こえるでしょう。私はおそらく...だからといって関数呼び出し規約は何ですか?それはアセンブリのことですか? –