好的,我在我的装配中有这条线
MOV EAX, DWORD PTR DS:[ESI]
其中ESI是00402050
(ascii,"123456789012")
在这条指令之后:EAX = 34333231
这里到底发生了什么?这个值是如何计算的,为什么?
我在哪里可以得到关于这类事情的一些好的参考?
发布于 2010-07-11 21:02:10
方括号中的寄存器(如[ESI]
)是解除引用的指针。您引用的指令将ESI
指定的内存位置中的DWORD
(32位/4字节值)移动到寄存器EAX
中。在本例中,读取为DWORD
的内存位置00402050
包含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
指令正在加载unsigned long
字符,就好像它们是ASCII值的四个字节一样,而实际上它们是一个单字节字符串。
https://stackoverflow.com/questions/3224524
复制