【发布时间】:2018-05-20 11:22:39
【问题描述】:
有一个问题困扰着我。
所以...为什么在 x86_32 中 参数 是在我觉得 按字母顺序 中的寄存器中传递的(eax, @987654324 @、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 中,它匹配函数调用约定,因此系统调用包装函数是轻量级的。在 i386 中,IDK 为什么它使用这种不方便的设置(
ebx是保留调用的,所以几乎每个系统调用包装器都需要保存/恢复 ebx。) -
@PeterCordes 函数调用约定旨在减少在实现
memcpy和rep movsb时的寄存器混洗量。 -
函数调用约定?也许我听起来像个菜鸟,也许是因为我是……但是什么是函数调用约定?那是大会的事情吗?
-
-
@ApostolisAnastasiou:通常你只会说“调用约定”,但我们需要区分函数的调用约定和系统调用的调用约定。有关两者的信息,请参阅stackoverflow.com/questions/2535989/…。 (这个问题可能与此链接或我之前评论中的链接重复...)
标签: assembly x86 x86-64 cpu-registers calling-convention