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值的四个字节,实际上它们是一串单字节字符。

链接地址: http://www.djcxy.com/p/85887.html

上一篇: 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