nasm中的enter

nasm手册:B.4.65    enter:     Create stack frame

ENTER imm,imm                 ; C8 iw ib             [186]

ENTER constructs a stack frame for a high-level language procedure call. The first operand (the iw in the opcode definition above refers to the first operand) gives the amount of stack space to allocate for local variables; the second (the ib above) gives the nesting level of the procedure (for languages like Pascal, with nested procedures).

The function of ENTER , with a nesting level of zero, is equivalent to

          PUSH EBP            ; or PUSH BP         in 16 bits 
          MOV EBP,ESP         ; or MOV BP,SP       in 16 bits 
          SUB ESP,operand1    ; or SUB SP,operand1 in 16 bits

This creates a stack frame with the procedure parameters accessible upwards from EBP , and local variables accessible downwards from EBP .

With a nesting level of one, the stack frame created is 4 (or 2) bytes bigger, and the value of the final frame pointer EBP is accessible in memory at [EBP-4] .

This allows ENTER , when called with a nesting level of two, to look at the stack frame described by theprevious value of EBP , find the frame pointer at offset -4 from that, and push it along with its new frame pointer, so that when a level-two procedure is called from within a level-one procedure, [EBP-4] holds the frame pointer of the most recent level-one procedure call and [EBP-8] holds that of the most recent level-two call. And so on, for nesting levels up to 31.

  翻译并增加些解释

 ENTER指令为高级语言的调用过程构造所必须的栈帧。第一个操作数(机器指令码中的iw(也就是伪指令中的imm))给出为本地参数所需要的栈帧空间的大小(此子函数没有用到本地局部变量,股此处的栈帧控件大小为0),第二个参数给出进程调用的嵌套级别(对于一些编程语言,像C(或者原文中的Pascal)语言之类的,都是支持函数的嵌套调用的)。

  enter指令的功能,对于指定嵌套级别为0,功能等价于一下几条汇编指令:

          PUSH EBP            ; or PUSH BP         in 16 bits 
          MOV EBP,ESP         ; or MOV BP,SP       in 16 bits 
          SUB ESP,operand1    ; or SUB SP,operand1 in 16 bits
 上述指令构建出一个栈帧,栈帧大小为operand1.在EBP之上,是进程的参数,在EBP之下,是本地变量。
对于嵌套级别为1的函数的栈帧,栈帧要比嵌套级别为0的大4(或2,对于16为的来说)个字节,最后一个嵌套层的EBP可以在第0层的EBP地址减小4位后找到(注意栈是向下增长的)。
  当enter调用嵌套级别为2的内嵌函数时,通过查找寄存器EBP描述的栈帧指针的以前的值,查找栈指针偏移量为-4的地址值,把这个值和新的栈指针值压栈,如此一来,当嵌套级别为2的进程调用嵌套级别为1的进程时,[EBP-4]保存最近的嵌套级别为1的栈指针,[EBP-8]保存级别为2的指针。按照这个规律,可以支持的最大嵌套级别为31层。

NASM开发了IDE,听起来很复杂,但并不像看上去那么复杂。虽然汇编编程不是那么容易的微分方程(可能是一个坏例子)。该IDE设计重量轻,但同时使用方便。因为汇编编程对于所有的命令行来说都是一件痛苦的事情。现在有人可能会说记事本++可以完成这项工作,但事实是记事本++只是一个具有可扩展插件的高级源代码编辑器。 特点:创建和打开一个项目(就像在Visual Studio那样,但要容易得多)。项目格式基于XML,类似于Visual Studio解决方案 ;能够 突出显示语法的源编辑器,具有 调试/运行和构建(编译、链接)、输出窗口(用于错误和警告) 、编译后实时突出显示错误,日志记录系统,其一个方便的日志文件在应用程序旁边,以防最坏的情况发生——应用程序由于灾难性的未散列错误而崩溃。 自动更新功能,允许您在IDE更新,无需从源代码重新生成或下载并安装任何东西。能够组装COM文件。需要一台可以运行旧MS-DOS代码的计算机。 添加了对PowerShell脚本和批处理脚本的内部脚本支持。对于高级用户。单击文档链接, 了解如何工作:NASM开发IDE高级功能指南:使用自定义脚本功能构建所有功能都可以在程序完成。记住,只是一个简单易用的图形界面。最好的是不需要NASM命令行经验。不支持C,请记住,我设想这个项目是一个简单易用的NASM IDE,如果您想开发C应用程序,它们是许多专有的IDE,如Visual Studio,甚至是开源的。这意味着没有C源文件。 但是,如果你真的非常需要它,它不使学习NASM或其他低级汇编语言变得容易。它只是让构建NASM应用程序变得更容易,而不必反复输入无聊的命令;或者反复运行相同的脚本。尽管我可能会添加几个从小型到型的NASM示例项目,但只要第一个预览版本发布了。如果社区想要捐赠优秀的示范项目,那就加入这个项目吧。 截至2012年11月17日,第一个测试版已经发布了许多错误修复、功能和改进。官方支持Windows 8!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值