我知道dword ptr是一个size指令,它指示在哪里移动的内容的大小,并且我知道mov eax,eax是nop代码的一种形式,但是这做了什么呢?
我认为它用里面的十六进制值交换了eax的地址,但我不太确定,甚至不知道为什么会发生这种情况。
发布于 2014-09-04 05:55:11
指令mov eax, eax可能是一个非操作代码,但是这里不是这样的。您正在从内存中加载,如[]“contents of”字符所示。
它用内存的内容(在本例中是32位的eax )加载eax当前指向的内容。
也许一张图形图片会有帮助:
Before:
eax: 0x12345678
memory @ 0x12345678: 0xffffffff
After:
eax: 0xffffffff
memory @ 0x12345678: 0xffffffff至于可能的用途,无疑有很多。立即出现的一个是链表结构,其中对于列表中的单个元素(伪程序集)有这样的内容:
next: word ? ; one word.
payload: byte ?(32) ; 32 bytes.如果将eax用作指向这些元素之一的指针,则获取下一个元素将使用您看到的指令完成:
mov eax, dword ptr [eax]发布于 2014-09-04 05:52:27
它用EAX最初指向的DWORD值加载EAX。
在C术语中,它取消引用EAX中最初持有的值如下:"eax = *eax“
发布于 2014-09-04 05:54:19
dword ptr [eax] -指向内存,该内存地址为eax,因此该语句将32位值从内存复制到eax。
https://stackoverflow.com/questions/25658069
复制相似问题