我在汇编时使用了堆栈,但我不知道推送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
Run Code Online (Sandbox Code Playgroud)
jyz*_*jyz 70
我不确定这是否是您的疑问,但也许您对此感到疑惑:
push ebp
mov ebp, esp
sub esp, 12
Run Code Online (Sandbox Code Playgroud)
前两行被称为prolog汇编函数.它存储先前的基指针(ebp)并将基指针设置为堆栈的顶部.这意味着所有堆栈内容都保存在堆栈中,因此该函数可以在堆栈中推送/弹出.
该sub esp,12
行为函数中的局部变量节省了空间.
最后你有:
mov esp, ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)
这与prolog相反,因此可以恢复先前的上下文.
这是你的怀疑吗?:)
Car*_*rum 43
ebp
被称为基指针或帧指针.在进入函数时,将其推送(以保存调用函数的值).然后,将esp
堆栈指针复制到ebp
,以便ebp
现在指向函数的堆栈帧.在函数结束时,然后弹出,ebp
以便恢复调用函数的值.
为了澄清究竟发生了什么 - push
指令将指定寄存器(ebp
在本例中)的值放入堆栈,并将堆栈指针递减适当的量.的pop
操作是相反的-它递增堆栈指针和从堆栈取值并把它在指定的寄存器中.
归档时间: |
|
查看次数: |
65557 次 |
最近记录: |