在x86程序集中向堆栈添加变量

nim*_*rod 0 x86 assembly local-variables x86-16

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

谢谢!!

Nec*_*lis 15

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

这个空间需要在函数出口进行清理,所以如果你PUSH编一个寄存器,你应该POP是或,ADD ESP,xxx其中xxx是大小最初SUB"版/中的寄存器中的尺寸PUSHED对准堆栈大小.

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

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

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

正如您所看到的,这有点棘手,所以更好的方法是创建代表您想要的C或C++代码,编译它-O0(我们编译时不进行优化以防止将堆栈变量省略到寄存器)然后对其进行反汇编,以及看看编译器是如何做到的.