【问题标题】:What does mov eax, dword ptr [eax] do?mov eax, dword ptr [eax] 是做什么的?
【发布时间】:2014-10-28 18:22:40
【问题描述】:

我知道 dword ptr 是一个 size 指令,指示要移动到哪里的大小,我知道 mov eax, eax 是 nop 代码的一种形式,但这有什么作用?

认为它将 eax 的地址与内部的十六进制值交换,但我不太确定甚至不知道为什么会发生这种情况。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    指令mov eax, eax 可能是一个无操作代码,但不是你在这里看到的。正如[]“contents-of”字符所示,您正在从内存加载。

    它加载eax 与当前由eax 指向的内存的内容(在这种情况下为32 位dword)。

    也许图形图片会有所帮助:

    Before:
        eax:                 0x12345678
        memory @ 0x12345678: 0xffffffff
    
    After:
        eax:                 0xffffffff
        memory @ 0x12345678: 0xffffffff
    

    至于可能的用途,毫无疑问有很多。立即浮现在脑海的是一个链表结构,对于列表中的单个元素(伪程序集),您有类似的东西:

    next:      word     ?         ; one word.
    payload:   byte     ?(32)     ; 32 bytes.
    

    如果eax 用作指向这些元素之一的指针,则可以使用您看到的指令来获取 next 元素:

    mov eax, dword ptr [eax]
    

    【讨论】:

    • 哦,我其实不知道 [] 的意思是 content of。那么dword ptr eax可以不带括号吗?
    • @user2893243,这没有任何意义。 eax 是一个 确定 32 位值,而您可能希望从内存中加载单个字节、一个字、一个双字或(至少在 x64 中)一个四字(对于 rax 而不是比eax)。
    • 啊,好吧,如果我想做word ptr eax,这首先没有意义,我会简单地做:ax。顺便说一句,你知道什么好的组装书籍吗?
    • 顺便说一下,这种从指针寄存器加载 a 到自身的方法通常在链接数据结构(例如链接列表)中找到,因为它允许编译器将单个寄存器用作“当前元素”指针。
    • @Leeor:很好的用例,我已将其添加到答案中,尽管有点晚了:-)
    【解决方案2】:

    它使用 EAX 最初指向的 DWORD 值加载 EAX。

    在 C 术语中,它取消引用最初保存在 EAX 中的值如下:“eax = *eax”

    【讨论】:

    • +1 表示 "dereferencing" 指针,我认为这是最简单的正确答案
    【解决方案3】:

    dword ptr [eax] - 指向内存,地址为eax,所以这条语句将32位值从内存复制到eax

    【讨论】:

      【解决方案4】:

      关于为什么会发生这种情况,这取决于上下文。

      例如,这可用于将[eax] 的值加载到堆栈上,以将其用作函数调用的参数。这个操作不能一次完成(如mov dword [esp + 4], dword [eax],同一条指令不能有两个内存引用),所以分成两条指令:

      mov eax, dword [eax]
      mov dword [esp + 4], eax
      

      【讨论】:

      • 为此,您通常会使用push dword ptr [eax],具体取决于您处理堆栈参数的策略。在代码中找到这个的一个更可能的原因是对链表或树的循环。但是,是的,如果它不在循环中,那么当您以后不需要指针值时,它确实可以是任何取消引用。就像只是通过一两个间接的链条来达到目标​​。
      猜你喜欢
      • 2015-01-25
      • 2011-03-14
      • 2014-03-02
      • 1970-01-01
      • 2017-05-05
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多