Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将登记册移到其自身的目的是什么;mov(%eax),eax;?_Assembly_X86 - Fatal编程技术网

Assembly 将登记册移到其自身的目的是什么;mov(%eax),eax;?

Assembly 将登记册移到其自身的目的是什么;mov(%eax),eax;?,assembly,x86,Assembly,X86,在使用GCC分解简单C代码时,我遇到了: mov (%eax), eax 我对汇编的理解是,当寄存器周围有()时,就是在向内存地址添加一些数字,即0x4(%eax)意味着寄存器上方有4个字节%eax 然而,在这里,()之前没有数字,因此它似乎正在将寄存器中的值复制到自身 我注意到,%eax寄存器通常用于返回变量,这一行在函数调用后立即出现,因此我猜想这条指令实际上是在告诉机器为被调用函数获取%eax寄存器中的任何内容(即返回值)并输入当前函数的%eax寄存器 这是正确的吗?如果没有,我错了什么

在使用GCC分解简单C代码时,我遇到了:

mov (%eax), eax
我对汇编的理解是,当寄存器周围有
()
时,就是在向内存地址添加一些数字,即
0x4(%eax)
意味着寄存器上方有4个字节
%eax

然而,在这里,
()
之前没有数字,因此它似乎正在将寄存器中的值复制到自身

我注意到,
%eax
寄存器通常用于返回变量,这一行在函数调用后立即出现,因此我猜想这条指令实际上是在告诉机器为被调用函数获取
%eax
寄存器中的任何内容(即返回值)并输入当前函数的
%eax
寄存器

这是正确的吗?如果没有,我错了什么,它到底在做什么?

()
在at&t语法中表示内存解引用,您可能应该阅读有效地址语法。等效的C代码是
eax=*eax
意思是,使用
eax
的当前值作为地址从内存中加载4个字节,并用获取的值覆盖
eax

函数调用和返回不影响寄存器的值(当然,堆栈和指令指针除外),调用方或被调用方没有
eax
的概念


PS:如果您对at&t不满意,您可以使用
设置反汇编风格英特尔
gdb
切换到英特尔语法模式。

我建议您使用英特尔语法而不是at&t语法。IMO更容易阅读。应该是
mov(%eax),%eax
。这只是将地址
EAX
处的长单词复制到
EAX
寄存器中。@Jonathon:这真的取决于你是在什么地方长大的。@TonyK因此出现了“在我看来”…@Jonathon:想必,在你看来,英特尔的语法客观上更好。否则你就不会推荐它了。我只是指出这是一个非常主观的问题。