You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编中%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:55:21