assembly - x86 汇编 AT&T 语法中 "%register"和 "(%register)"之间的区别?

标签 assembly x86 att

到目前为止,我目前的理解是: movq %rdi, %rax 将值从寄存器 %rdi 移动到寄存器 %rax

movq (%rdi), %rax 会将内存中的值从(%rdi) 移动到寄存器%rax

但是,我无法理解这在功能上的实际含义。在什么情况下这两条流水线会以不同的结果结束?

最佳答案

每次地址 (%rdi) 的内存不包含自己的地址时,都会产生不同的结果。换句话说,几乎总是。如果不是,那只是巧合或非常不寻常的代码的结果。

一些 C 来演示等效的问题“两个 printf 语句何时打印相同的结果?”

#include <stdio.h>

int main()
{
  int a,*p;
  int b=5;
  p=&b;

  a=*p;
  printf("%d\n", a);
  a=(int)p;
  printf("%d\n", a);
}

是的,这会产生警告 cast from pointer to integer of different size 但这不是重点。

关于assembly - x86 汇编 AT&T 语法中 "%register"和 "(%register)"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679574/

相关文章:

c - 如何将Atmel AVR汇编代码转换为C语言代码

string - 移动到缓冲区内字符串的末尾 - 汇编语言

c - 编译时哪个效率更高?

c - 拆解二元炸弹第三阶段逻辑难理解

x64 JMP 指令的汇编解码

c - 提高寄存器机虚拟机上循环的简单自制 JIT 的性能

assembly - 如果我在 x86 AT&T 语法中省略了比例因子和索引寻址模式,会发生什么?

assembly - 关于 [base + index*scale + disp] 和 AT&T disp(base,index,scale) 的几个问题

c++ - 奇怪的 C++ 链表错误