有关在组装中推送ebp和pop ebp指令的说明
我在程序集中使用堆栈,但我没有想到推ebp和pop ebp。
.intel_syntax noprefix .include "console.i" .text askl: .asciz "Enter length: " askb: .asciz "Enter breadth: " ans: .asciz "Perimeter = " _entry: push ebp # establishing stack-frame mov ebp, esp sub esp, 12 Prompt askl GetInt [ebp-4] # length Prompt askb GetInt [ebp-8] # breadth mov eax, [ebp-4] # eax = l add eax, [ebp-8] # eax = l + b add eax, eax # eax = 2 * (l + b) mov [ebp-12], eax Prompt ans PutInt [ebp-12] PutEoL mov esp, ebp pop ebp # unwinding stack-frame ret .global _entry .end
我不确定这是否是你的疑问,但也许你想知道这个:
push ebp mov ebp, esp sub esp, 12
前两行是prolog汇编函数。 它存储以前的基址指针(ebp),并将基指针设置为栈顶。 这意味着所有的堆栈内容都保存在堆栈中,所以函数可以在堆栈中popup/popup。
sub esp,12
行是为本地variables保存空间的function。
最后你有:
mov esp, ebp pop ebp ret
这是prolog所反过来的,所以前面的上下文可以被恢复。
这是你的疑问吗? 🙂
ebp
被称为基指针或帧指针。 在进入你的function,你推它(保存调用函数的值)。 然后,将esp
,堆栈指针复制到ebp
,以便ebp
现在指向函数的堆栈帧。 在你的函数结束时,你popupebp
以便调用函数的值被恢复。
为了澄清究竟发生了什么 – push
指令将来自指定寄存器(本例中为ebp
)的值放到堆栈上,并将堆栈指针递减适当的量。 pop
操作是相反的 – 它会增加堆栈指针,并从堆栈中取值,并将其放入指定的寄存器中。