在使用GCC拆解简单的C代码时,我遇到了:
mov (%eax), eax
我对汇编的理解是当你()
围绕一个寄存器时,你正在向存储器地址添加一些数字,即0x4(%eax)
意味着寄存器%eax
上方4个字节
但是,在()
之前没有数字,所以它似乎是将寄存器中的值复制到自身。
我注意到%eax
寄存器常用于返回变量,这一行在函数调用后立即发生,所以我的猜测是这条指令实际上是告诉机器采取{{1}中的任何内容{1}}注册被调用函数(即返回值)并将%eax
寄存器放入当前函数。
这是对的吗?如果没有,我有什么问题,它到底在做什么?
答案 0 :(得分:2)
()
表示内存解除引用,您应该阅读有效的地址语法。等效的C代码为eax=*eax;
,意味着使用当前值eax
作为地址从内存加载4个字节,并用获取的值覆盖eax
。
函数调用和返回不会影响寄存器的值(当然,堆栈和指令指针除外),调用者或被调用者的eax
概念都没有。
PS:如果您对& t不满意,可以使用gdb
将set disassembly-flavor intel
切换到英特尔语法模式。