汇编的Enter, leave, return 指令

本文介绍了汇编语言中的关键指令enter和leave的用法及其等价替换形式,通过具体实例展示了如何利用这些指令进行局部变量的分配与释放,此外还解释了return语句的不同形式。

enter的用法:

enter   8, 3                   ;就是申请8个存储单元(在堆栈中),特权为3

http://www.cnblogs.com/keepfocus/archive/2011/09/15/2176925.html
1. enter等价于:
push ebp
mov ebp,  esp
在函数的入口时常用。

ENTER   n   申请局部变量,相当于
push    bp
mov     bp,   sp
sub     sp,   n

2. leave等价于:
mov esp,  ebp
pop ebp

 leave   与   ENTER   配对使用

 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

一段常见的代码格式如下:

.text:00401450 push    ebp
.text:00401451 mov     ebp, esp
.text:00401453 sub     esp, 18h
....
.text:0040146E call    sub_401B10
.text:00401473 mov     eax, 1
.text:00401478 mov    esp,   ebp
                         pop    ebp
                         xor    eax,  eax
.text:00401479 retn    0Ch
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

用enter和leave替代了以后,就可以变成这个样子。
.text:00401450 enter
.text:00401453 sub     esp, 18h
...
.text:0040146E call    sub_401B10
.text:00401473 mov     eax, 1
.text:00401478 leave
                         xor eax, eax
.text:00401479 retn    0Ch

 

 

return   语句有以下几种
        ret               默认为NEAR,在PROC中由PROC属性决定
        retn             强制NEAR
        retf             强制FAR
        ret     n         默认为NEAR,在PROC中由PROC属性决定,同时SP   +=   n
        retn   n         强制NEAR,同时SP   +=   n
        retf   n         强制   FAR,同时SP   +=   n
        iret             中断程序返回
  

请帮我完成这道汇编语言的上机实验的代码:3、汉诺塔问题。 要求:(1)定义递归子程序hanoi,输出盘子的移动步骤,并返回盘子的移动次数。该过程的C函数原型为:short hanoi(short n, char from, char to, char aux)。参数说明:n: 当前要移动的盘子数量,from: 起始柱子,to: 目标柱子,aux: 辅助柱子。要求用堆栈传参。 (2)定义子过程printf,实现格式化输出,能够处理字符串中包含的格式控制符(%c、%d)。 (3)定义主过程main,调用两个子过程,测试程序功能。 汉诺塔的C语言代码如下:#include <stdio.h> // 汉诺塔递归函数 short hanoi(short n, char from, char to, char aux) { // 基准情况:只有一个盘子时直接移动 if (n == 1) { printf("Move disk %d from %c to %c\n", n, from, to); return 1; } short count; // 递归步骤1:将n-1个盘子从起始柱移动到辅助柱 count=hanoi(n - 1, from, aux, to); // 移动第n个盘子(最大的盘子) printf("Move disk %d from %c to %c\n", n, from, to); count++; // 递归步骤2:将n-1个盘子从辅助柱移动到目标柱 count+=hanoi(n - 1, aux, to, from); return count; } int main() { int n; printf("Please enter the number of disks for the Hanoi Tower:"); scanf("%d", &n); // 验证输入有效性 if (n < 1) { printf("Error: The number of disks must be greater than 0.\n"); return 1; } printf("\nHanoi Tower Solution (%d disks):\n", n); printf("==========================\n"); // 调用递归函数 // A: 起始柱, C: 目标柱, B: 辅助柱 short count=hanoi(n, 'A', 'C', 'B'); printf("==========================\n"); printf("Total moves: %d\n",count ); return 0; } 请根据上述C语言代码完成汇编语言代码的编写
05-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值