好的,所以我在我的集会中有这条线
MOV EAX, DWORD PTR DS:[ESI]
其中ESI为00402050
(ascii,“123456789012”)
执行此说明后:EAX = 34333231
这里到底发生了什么?如何计算这个值,为什么?
我在哪里可以得到一些关于这类事情的好参考?
答案 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>