2014-09-04 251 views
1

我知道dword ptr是一个size指示符,它指示正在被移动的位置的大小,并且我知道mov eax,eax是nop代码的一种形式,但这是干什么的?mov eax,dword ptr [eax]是做什么的?

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

回答

3

指令:

mov eax, eax 

可能是almost- nop代码(除设置标志等),但不是你有什么在这里。您正在从内存加载(如[]“内容”字符所示)。

它加载eax与当前由eax指向所述内容的存储器(一个32位双字在这种情况下)。

也许一个图形图像将帮助:

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

哦,我居然不知道[]的意思内容。那么是否可以在没有括号的情况下执行'dword ptr eax'? – user2893243 2014-09-04 06:03:07

+0

@ user2893243,这是没有道理的。 'eax'是一个_definite_ 32位值,而您可能希望从内存中加载一个单字节,一个字,一个dword或(至少x64)四字(对于'rax'而不是'eax')。 – paxdiablo 2014-09-04 06:05:16

+0

好的,所以如果我想做'word ptr eax',那首先就没有意义了,我只需要做'ax'。顺便说一句,你知道任何好的书籍组装? – user2893243 2014-09-04 06:07:55

2

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

在C组术语其解引用最初在EAX举行如下价值:“EAX = * EAX”

+0

+1 _“提领” _指针,它是我认为最简单的正确答案 – xmojmr 2014-09-05 15:20:36

1

dword ptr [eax] - 指向的内存,其地址为EAX,因此该语句复制32位从内存值到eax

相关问题