汇编语言ENTER和LEAVE指令:创建和结束堆栈帧

  • 内容
  • 评论
  • 相关

ENTER 指令为被调用过程自动创建堆栈帧。它为局部变量保留堆栈空间,把 EBP 入栈。具体来说,它执行三个操作:

  • 把 EBP 入栈 (push ebp)
  • 把 EBP 设置为堆栈帧的基址 (mov ebp, esp)
  • 为局部变量保留空间 (sub esp, numbytes)

ENTER 有两个操作数:第一个是常数,定义为局部变量保存的堆栈空间字节数;第二个定义了过程的词法嵌套级。

ENTER numbytes, nestinglevel

这两个操作数都是立即数。Numbytes 总是向上舍入为 4 的倍数,以便 ESP 对齐双字边界。Nestinglevel 确定了从主调过程堆栈帧复制到当前帧的堆栈帧指针的个数。在示例程序中,nestinglevel 总是为 0。

【示例 1】下面的例子声明了一个没有局部变量的过程:

MySub PROC
    enter 0,0

它与如下指令等效:

MySub PROC
    push ebp
    mov ebp, esp

【示例 2】ENTER 指令为局部变量保留了 8 个字节的堆栈空间:

MySub PROC
    enter 8,0

它与如下指令等效:

MySub PROC
    push ebp
    mov ebp,esp
    sub esp,8

下图为执行 ENTER 指令前后的堆栈示意图。

执行ENTER指令后的堆栈

本文标题:汇编语言ENTER和LEAVE指令:创建和结束堆栈帧

本文地址:https://www.hosteonscn.com/5433.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注