关于在程序集中推送ebp和pop ebp指令的解释

bun*_*nty 40 x86 assembly

我在汇编时使用了堆栈,但我不知道推送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相反,因此可以恢复先前的上下文.

这是你的怀疑吗?:)

  • 还要注意你有一个名为`leave`的指令,这正是`mov esp,ebp`和`pop ebp`所做的. (6认同)

Car*_*rum 43

ebp被称为基指针或帧指针.在进入函数时,将其推送(以保存调用函数的值).然后,将esp堆栈指针复制到ebp,以便ebp现在指向函数的堆栈帧.在函数结束时,然后弹出,ebp以便恢复调用函数的值.

为了澄清究竟发生了什么 - push指令将指定寄存器(ebp在本例中)的值放入堆栈,并将堆栈指针递减适当的量.的pop操作是相反的-它递增堆栈指针和从堆栈取值并把它在指定的寄存器中.