我正在学习x86-64汇编,让我感到困惑的一件事就是论证传递。从我已经理解到现在为止,在正常函数调用的情况下,参数被callie函数推送到堆栈上,并且被调用函数通过来自基指针的偏移量来访问。如果是系统调用,则通过使用传递参数rdi,rsi等寄存器,但是当我尝试查看以下代码片段的汇编代码时
#include <stdio.h>
#include <stdlib.h>
int by12(int);
int main(void)
{
int x = 2;
int y = by12(x);
printf("%d\n",y);
return 0;
}
int by12(int a)
{
return a*12;
}
然后装配结果
by12:
.LFB39:
.cfi_startproc
leal (%rdi,%rdi,2), %edx
leal 0(,%rdx,4), %eax
ret
main:
.LFB38:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $2, %edi
call by12
movl %eax, %edx
movl $.LC0, %esi
movl $1, %edi
movl $0, %eax
call __printf_chk
movl $0, %eax
addq $8, %rsp
我无法理解为什么生成的汇编代码使用rdi寄存器而不是使用堆栈基址偏移? 编辑 - 我在这个answer
中看到了基于堆栈的方法