|
发表于 2023-7-13 16:57:41
|
显示全部楼层
对于问题1:为什么是`mov eax,[esp]`而不是`mov eax,[esp+4]`?
在汇编代码的00401041行,该指令`mov eax,[esp]`是将栈顶的值(位于[esp]的位置)存储到eax寄存器中。由于先前已经执行了一系列push操作,将所需的参数压入栈中,所以在这里直接使用`mov eax,[esp]`来获取函数参数argc的值。
对于问题2:为什么是`mov eax,[esp+4]`而不是`mov eax,[esp]`?
在汇编代码的00401055行,该指令`mov eax,[esp+4]`是将相对于栈顶偏移4字节的值(位于[esp+4]的位置)存储到eax寄存器中。这里是因为先前的call指令和push指令都将两个参数压入了栈中,然后再进行相应的操作。所以在这里使用`mov eax,[esp+4]`来获取第二个参数n1的值。
总结:
问题1和问题2中的代码都没有错误。在汇编代码中,栈是以LIFO(Last-In-First-Out)的方式组织的,`[esp]`表示栈顶的值,而`[esp+4]`表示相对于栈顶偏移4字节的值。因此,在不同的位置上,需要根据具体需求来选择对应的偏移。 |
|