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

Von*_*Von 5 x86 assembly att

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

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

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

klu*_*utt 5

每次地址 (%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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我会说`(%rdi)`要么是*取消引用的指针*要么是*指向的值*(即:`*p`),而`%rdi`是指针存储的*地址*(即:`p`)。 (4认同)
  • 在我的示例中,等效的问题是“*p”是否是指向“p”的指针。它不是。它是指向“p”中包含的地址的指针。 (2认同)