MOV EAX,DWORD PTR DS:[ESI]是什么意思,它有什么作用?
好,所以我在我的组装中有这条线
MOV EAX, DWORD PTR DS:[ESI]
其中ESI是00402050
(ascii,“123456789012”)
在这个指令之后: EAX = 34333231
这里真的发生了什么? 这个值如何计算,为什么?
我在哪里可以得到一些关于这种事情的很好的参考?
方括号内的寄存器如[ESI]
是取消引用的指针。 您引用的指令将ESI
指定的内存位置中的DWORD
(一个32位/ 4字节值)移入寄存器EAX
。 在你的情况下,内存位置00402050
,作为DWORD
读取,包含34333231
。
写在伪C:
DWORD EAX; /* Declaring the registers as we find them in silico */
DWORD ESI;
ESI = 0x00402050; /* Set up your initial conditions for ESI */
EAX = *((DWORD *)ESI); /* mov EAX, DWORD PTR [ESI] */
/* ^ ^ ^^^^^^^ */
/* | | | */
/* | | +----------- From "DWORD PTR" we get "DWORD *" in C. */
/* | | */
/* | +----------------- The C dereferencing operator * replaces []. */
/* | */
/* +------------------- The C assignment operator = replaces mov opcode. */
在你的情况下, 0x00402050
不等于字符串"1234567890"
- 而是指向包含该字符串的内存。
您获得的值0x34333231
由数字"1234"
的ASCII值组成,它们是字符串的前四个字节(即第一个DWORD
)。 它们以相反的顺序出现,因为Intel架构在内存中的DWORD
的字节表示中是“小端”。
在你的示例中, mov
指令正在加载ASCII字符,就好像它们是unsigned long
值的四个字节,实际上它们是一串单字节字符。
上一篇: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?
下一篇: GCC Warning: implicit declaration of function 'puts' is invalid in C99