【问题标题】:What is the purpose of moving a register to itself as in "mov (%eax), eax"?像“mov(%eax),eax”那样将寄存器移动到自身的目的是什么?
【发布时间】: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:据推测,在您看来,英特尔语法在客观上更好。否则你不会推荐它。我只是指出这是一个非常主观的问题。

标签: assembly x86


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2017-05-05
    • 2019-03-30
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多