我想知道,如何在 ASM 的过程中设置局部变量?
谢谢!!
如果要在堆栈上存储变量,则需要为其预留空间,这通常是通过SUB ESP,xxx
序列来完成的,其中xxx
是要为其腾出空间的“变量”的大小,与堆栈对齐方式对齐(通常4字节,也可以是8或16)。此规则的唯一例外是当变量在寄存器中时,在这种情况下,您可以PUSH
在该寄存器上执行 a。
这个空间需要在函数退出时清理,所以如果你PUSH
编辑了一个寄存器,你应该POP
这样做,或者你最初编辑的大小ADD ESP,xxx
在哪里/你编辑的寄存器的大小与堆栈大小对齐。xxx
SUB
PUSH
读取和写入是使用 完成的MOV
,但这有点棘手,因为我们有两种情况,有堆栈帧和没有堆栈帧。
没有堆栈帧需要更多的数学运算,因为您需要补偿堆栈上的函数参数,所以如果我们的函数需要 2 个参数,并且我们为堆栈上的整数分配空间,我们可以通过 写入它MOV [ESP + 0xC],value
,读取是相同的MOV EAX,[ESP + 0xC]
.
使用堆栈帧,您的参数采用正索引,EBP
并且您分配的内存从 负索引EBP
,因此对于上面相同的示例,您可以这样做MOV EAX,[EBP-4]
。
正如你所看到的,这有点棘手,所以更好的方法是创建代表你想要的 C 或 C++ 代码,编译它-O0
(我们编译时没有优化以防止堆栈变量省略到寄存器)然后反汇编它,然后看看编译器是怎么做的。