【发布时间】:2014-07-27 13:07:20
【问题描述】:
在使用 GCC 反汇编简单的 C 代码时,我遇到了:
mov (%eax), eax
我对汇编的理解是,当您在寄存器周围有() 时,您是在向内存地址添加一些数字,即0x4(%eax) 表示寄存器%eax 上方4 个字节。
然而,这里()之前没有数字,所以它似乎将寄存器中的值复制到自身。
我注意到%eax 寄存器通常用于返回变量,并且这一行在函数调用之后立即出现,所以我的猜测是这条指令实际上是在告诉机器获取%eax 中的任何内容注册被调用函数(即返回值)并放入当前函数的%eax寄存器。
这是正确的吗?如果没有,我做错了什么,它实际上在做什么?
【问题讨论】:
-
我建议使用 Intel 语法而不是 AT&T 语法。 IMO 更容易阅读。
-
应该是
mov (%eax),%eax。这只是将地址EAX处的长字复制到EAX寄存器中。 -
@Jonathon:这真的取决于你是靠什么长大的。
-
@TonyK 因此“在我看来”....
-
@Jonathon:据推测,在您看来,英特尔语法在客观上更好。否则你不会推荐它。我只是指出这是一个非常主观的问题。