AT&T汇编语法中括号为何随上下文变化?%rdi与(%rdi)有何区别?
%rdi 与 (%rdi) 的区别解析
你的核心理解是完全正确的,针对mov和cmp这类指令,两者的差异可以明确拆解为:
%rdi:直接使用寄存器值
当指令中写%rdi时,操作的就是RDI寄存器里存储的数值本身。比如你提到的场景:- 如果RDI存的是ASCII字符'w'的数值(0x77),
mov %rdi, %rax会把0x77直接拷贝到RAX寄存器;cmp %rdi, %rbx则是把RBX寄存器的值和0x77做比较。 - 如果RDI存的是0x1007bf,
%rdi就代表这个十六进制数值本身,指令会直接对这个数值进行操作。
- 如果RDI存的是ASCII字符'w'的数值(0x77),
(%rdi):以寄存器值为地址访问内存
当指令中写(%rdi)时,是把RDI里的数值当作内存地址,去访问该地址对应的内存单元中的数据。对应你的场景:- 若RDI存的是0x77('w'的ASCII码),
(%rdi)指的是尝试读取内存地址0x77处的值——但要注意,现代操作系统中低地址(比如0x77)属于未映射的无效空间,实际执行这类指令会触发段错误(Segmentation Fault),所以这种用法仅存在理论寻址逻辑,实际代码中无法正常运行。 - 若RDI存的是0x1007bf,
mov (%rdi), %rax会把内存地址0x1007bf处的8字节(x86-64架构下默认操作数大小)数据加载到RAX;cmp (%rdi), %rbx则是比较RBX的值和该地址内存中的数据。
- 若RDI存的是0x77('w'的ASCII码),
内容的提问来源于stack exchange,提问作者JBatswani
相关产品推荐
相关产品推荐

