据我所知,dword ptr是一个大小指令,用于指示移动内容的大小,我知道mov eax,eax是一种nop代码形式,但是这样做了什么?
我认为它用内部的十六进制值交换了eax的地址,但我不太确定甚至不知道为什么会发生这种情况。
答案 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