【发布时间】:2018-02-05 13:56:24
【问题描述】:
我正在阅读intel manual 关于调用约定以及哪个寄存器有哪个用途。这是Figure 3.4: Register Usage 中指定的内容:
%rax temporary register; with variable arguments
passes information about the number of vector
registers used; 1st return register
但是在linux api 中我们使用rax 来传递函数号。是否与intel手册中的规定一致?实际上我希望(根据手册)我们将函数号传递给rdi(它用于第一个参数)。等等……
我可以使用rax 在我的手写函数中传递第一个函数参数吗?例如
mov rax, [array_lenght_ptr]
mov rdi, array_start_ptr
callq _array_sum
【问题讨论】:
-
系统调用使用与用户空间略有不同的约定。是的,你可以在你的手写函数中做任何你想做的事情。
-
@Jester 做任何我想做的事听起来有点乱。我想了解并遵守调用约定。
-
请注意 32 位和 64 位 linux 的系统调用接口非常不同。对于 32 位,%ebx、%ecx、%edx;对于 64 位 %rdi、%rsi、%rdx。但系统调用号总是通过%eax(或%rax)
-
“想做什么就做什么听起来有点乱。” 你专门问你能不能……我刚刚回答了。
-
@St.Antario 确实!里面说的都是对的。请注意,§3.3 为系统调用指定了一个单独的调用约定,其中包括您已经观察到的
rax的使用。
标签: linux assembly x86-64 calling-convention