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
相关产品推荐
相关产品推荐

