0

我想知道,如何在 ASM 的过程中设置局部变量?

谢谢!!

4

1 回答 1

18

如果要在堆栈上存储变量,则需要为其预留空间,这通常是通过SUB ESP,xxx序列来完成的,其中xxx是要为其腾出空间的“变量”的大小,与堆栈对齐方式对齐(通常4字节,也可以是8或16)。此规则的唯一例外是当变量在寄存器中时,在这种情况下,您可以PUSH在该寄存器上执行 a。

这个空间需要在函数退出时清理,所以如果你PUSH编辑了一个寄存器,你应该POP这样做,或者你最初编辑的大小ADD ESP,xxx在哪里/你编辑的寄存​​器的大小与堆栈大小对齐。xxxSUBPUSH

读取和写入是使用 完成的MOV,但这有点棘手,因为我们有两种情况,有堆栈帧和没有堆栈帧。

没有堆栈帧需要更多的数学运算,因为您需要补偿堆栈上的函数参数,所以如果我们的函数需要 2 个参数,并且我们为堆栈上的整数分配空间,我们可以通过 写入它MOV [ESP + 0xC],value,读取是相同的MOV EAX,[ESP + 0xC].

使用堆栈帧,您的参数采用正索引,EBP并且您分配的内存从 负索引EBP,因此对于上面相同的示例,您可以这样做MOV EAX,[EBP-4]

正如你所看到的,这有点棘手,所以更好的方法是创建代表你想要的 C 或 C++ 代码,编译它-O0(我们编译时没有优化以防止堆栈变量省略到寄存器)然后反汇编它,然后看看编译器是怎么做的。

于 2012-06-05T07:13:06.570 回答