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

x86-64架构函数参数寄存器%rdi的取值及指令使用疑问

x86-64架构中%rdi寄存器的参数传递规则

在x86-64的System V调用约定(Linux、BSD、macOS等系统遵循的标准)下,%rdi寄存器存储的是第一个函数参数的值,而非参数的地址(引用)。

关键区分点

  • 如果参数是基本数据类型(比如int、char),%rdi里直接存的就是该参数的数值。
  • 如果参数是指针类型(比如int*),%rdi里存的是指针本身的值——也就是目标内存的地址,但这本质上还是参数的值,而非“引用”(引用在汇编层面没有特殊处理,本质是指针的语法糖)。

指令场景中的使用方式

  • 直接使用%rdi:操作的就是第一个参数的值。比如mov %rdi, %rax,就是把第一个参数的值直接复制到%rax寄存器中;cmp $10, %rdi则是把第一个参数的值和10做比较。
  • 使用(%rdi):是将%rdi中的内容当作内存地址,去读取该地址对应的内存数据。只有当第一个参数本身是指针类型时,(%rdi)才能拿到指针指向的实际数据——这时候它获取的不是参数本身的值,而是参数指向的内容。

示例说明

比如C代码:

void example(int num, int *ptr) {
    int a = num;       // 对应汇编直接使用%rdi的值
    int b = *ptr;      // 对应汇编使用(%rsi),因为%rsi是第二个参数(指针)
}

对应的核心汇编逻辑:

example:
    movl    %edi, -4(%rbp)    ; 将第一个参数num的值存入栈上变量a
    movq    %rsi, -16(%rbp)   ; 将第二个参数ptr的指针值存入栈
    movq    -16(%rbp), %rax
    movl    (%rax), -8(%rbp)  ; 通过(%rax)读取ptr指向的内存值,存入栈上变量b
    ret

内容的提问来源于stack exchange,提问作者JBatswani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:24:59