mov eax,dword ptr [eax]做什么?

时间:2014-09-04 05:45:36

标签: assembly ollydbg

据我所知,dword ptr是一个大小指令,用于指示移动内容的大小,我知道mov eax,eax是一种nop代码形式,但是这样做了什么?

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

指示:

mov eax, eax

可能是nop代码,但您拥有的内容。您正在从内存加载,如[]"内容 - "字符。

它使用eax当前指向的内存的内容(在本例中为32位dword)加载eax

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

Before:
    eax:                 0x12345678
    memory @ 0x12345674: 0xeeeeeeee
                      8: 0xffffffff
After:
    eax:                 0xffffffff
    memory @ 0x12345674: 0xeeeeeeee
                      8: 0xffffffff

答案 2 :(得分:2)

dword ptr [eax] - 指向内存,哪个地址是eax,因此该语句将32位值从内存复制到eax

答案 3 :(得分:0)

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

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

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