将注册表移动到自身的目的是什么,如" mov(%eax),eax"?

时间:2014-07-27 13:07:20

标签: assembly x86

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

mov (%eax), eax

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

但是,在()之前没有数字,所以它似乎是将寄存器中的值复制到自身。

我注意到%eax寄存器常用于返回变量,这一行在函数调用后立即发生,所以我的猜测是这条指令实际上是告诉机器采取{{1}中的任何内容{1}}注册被调用函数(即返回值)并将%eax寄存器放入当前函数。

这是对的吗?如果没有,我有什么问题,它到底在做什么?

1 个答案:

答案 0 :(得分:2)

at& t语法中的

()表示内存解除引用,您应该阅读有效的地址语法。等效的C代码为eax=*eax;,意味着使用当前值eax作为地址从内存加载4个字节,并用获取的值覆盖eax

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

PS:如果您对& t不满意,可以使用gdbset disassembly-flavor intel切换到英特尔语法模式。