汇编中%rdi是什么?它的取值来源及调用约定相关问题
x86-64寄存器传参相关问题解答
1. %rdi是否为函数第一个参数的寄存器?
是的,在x86-64架构的System V调用约定(Linux、macOS等主流操作系统默认采用)中,%rdi就是用来传递第一个整数/指针类型函数参数的寄存器,你的示例代码里foo的参数int* p正好对应%rdi,完全符合这个规则。
2. 为何采用寄存器传参?
- 执行效率更高:寄存器的访问延迟远低于栈内存,用寄存器传参能减少内存读写操作,大幅提升函数调用的执行速度
- 降低开销:避免了参数压栈、出栈的指令操作,既节省指令周期,也减少了栈空间的占用
3. 还有哪些寄存器用于传递参数?数量多少?
在x86-64 System V调用约定中,前6个整数/指针类型参数会依次使用以下寄存器传递:
%rdi(第1个参数)%rsi(第2个参数)%rdx(第3个参数)%rcx(第4个参数)%r8(第5个参数)%r9(第6个参数)
如果参数数量超过6个,剩余的参数才会通过栈传递。另外,浮点类型参数有独立的寄存器组(%xmm0至%xmm7),专门用于传递浮点参数。
示例代码
C++代码
int foo(int * p) { int y = 7; if (p) ++y; return y; }
对应汇编代码
foo(int*): cmpq $1, %rdi movl $7, %eax sbbl $-1, %eax ret
优质参考资料
- 《Programming from the Ground Up》:你正在阅读的这本,从汇编底层视角讲解程序运行机制,非常适合理解高级语言与硬件指令的对应关系
- 《x86-64 Assembly Language Programming with Ubuntu》:专注x86-64架构,结合Linux实践,对调用约定等底层细节讲解细致
- Intel官方《Intel 64 and IA-32 Architectures Software Developer Manuals》:最权威的x86架构参考文档,涵盖所有寄存器、指令的详细定义
- GCC/Clang官方文档:可查看编译器关于调用约定的实现细节,以及编译选项对传参方式的影响
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

