到目前为止,我目前的理解是:
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/