什么MOV EAX,DWORD PTR DS:[ESI]意味着什么呢?

时间:2010-07-11 20:28:43

标签: assembly x86

好的,所以我在我的集​​会中有这条线

MOV EAX, DWORD PTR DS:[ESI]

其中ESI为00402050(ascii,“123456789012”)

执行此说明后:EAX = 34333231

这里到底发生了什么?如何计算这个值,为什么?
我在哪里可以得到一些关于这类事情的好参考?

1 个答案:

答案 0 :(得分:67)

方括号中的寄存器(例如[ESI])是解除引用的指针。您引用的指令将DWORD(一个32位/ 4字节值)移动到ESI指定的内存位置到寄存器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)。它们以相反的顺序出现,因为英特尔架构在内存中DWORD的字节表示中是“小端”。

在您的示例中,mov指令正在加载ASCII字符,就像它们是unsigned long值的四个字节一样,当它们实际上是一串单字节字符时。 / p>