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