汇编 子程序设计 阶乘.docx
- 文档编号:4092994
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:11
- 大小:1.01MB
汇编 子程序设计 阶乘.docx
《汇编 子程序设计 阶乘.docx》由会员分享,可在线阅读,更多相关《汇编 子程序设计 阶乘.docx(11页珍藏版)》请在冰豆网上搜索。
汇编子程序设计阶乘
昆明理工大学信息工程与自动化学院学生实验报告
(2010—2011学年第一学期)
课程名称:
汇编与微机接口开课实验室:
2010年12月10日
年级、专业、班
计科083
学号
姓名
成绩
实验项目名称
子程序设计
指导教师
教师评语
教师签名:
年月日
一.实验目的
1.掌握子程序设计的方法;
2.输入并汇编求N!
程序;
3.观察并记录运行结果。
二.子程序设计方法
1.过程定义伪操作
过程调用伪操作用在过程(子程序)的前后,使整个过程形成清晰的、具有特定功能的代码块,其格式为:
procedurenamePROCAttribute
:
procedurenameENDP
2.子程序调用和返回
3.保护与恢复寄存器
4.子程序的参数传递
(1)通过寄存器传送参数
(2)如果过程和调用程序在同一源文件中,则过程可直接访问模块中的变量
(3)通过地址表传送参数地址
(4)通过堆栈传送参数或参数地址
(5)多个模块之间的参数传递问题
5.增强功能的过程定义伪操作
三.输入并汇编求N!
程序
1.N!
程序描述
在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。
显然递归调用是子程序嵌套的一种特殊情况。
使用递归算法往往能设计出效率较高的程序。
递归调用最简单例子是计算阶乘。
求N!
本身是一个子程序,由于N!
是N和(N-1)!
的乘积,所以为求(N-1)!
必须递归调用求N!
的子程序,只是每次调用所使用的参数不同而已。
2.N!
程序流程图
3.N!
源程序
STACKSGSEGMENTSTACK'S';定义堆栈
DW128DUP('ST')
STACKSGENDS
DATASEGMENT
N_VALDW4;定义N值
RESULTDW?
;结果
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKSG
FRAMESTRUC;定义帧结构
SAV_BPDW?
;保存BP值
SAV_CS_IPDW2DUP(?
);保存返回地址
NDW?
;当前N值
RESULT_ADDRDW?
;结果地址
FRAMEENDS
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
LEABX,RESULT
PUSHBX;结果地址入栈
PUSHN_VAL;N值入栈
CALLFARPTRFACT;调用递归子程序
MOVCL,10
MOVAX,RESULT
DIVCL
;把阶乘结果转换成十进制数
ORAX,3030H;转换成ASCII码
MOVDL,AL
MOVAH,2;显示结果的高位
INT21H
MOVAX,RESULT
DIVCL
;把阶乘结果转换成十进制数
ORAX,3030H;转换成ASCII码
MOVDL,AH
MOVAH,2;显示结果的低位
INT21H
R1:
MOVAX,4C00H
INT21H
MAINENDP
FACTPROCFAR;N!
递归子程序
PUSHBP;保存BP值
MOVBP,SP;BP指向帧基地址
PUSHBX
PUSHAX
MOVBX,[BP].RESULT_ADDR
MOVAX,[BP].N;取帧中N值
CMPAX,0
JEDONE;N=0时退出子程序嵌套
PUSHBX;为下一次调用压入结果地址
DECAX
PUSHAX;为下一次调用压入(N-1)值
CALLFARPTRFACT
R2:
MOVBX,[BP].RESULT_ADDR
MOVAX,[BX];取中间结果(N-1)!
MUL[BP].N;N*(N-1)!
JMPSHORTRETURN
DONE:
MOVAX,1;0!
=1
RETURN:
MOV[BX],AX;存中间结果
POPAX
POPBX
POPBP
RET4
FACTENDP
CODEENDS
ENDMAIN
四.实验记录和运行结果
1.用MASM程序产生OBJ文件
使用jiecheng.asm作为输入文件,通过汇编程序MASM程序产生二进制的目标文件JIECHENG.OBJ。
2.用LINK程序产生EXE文件
汇编程序已产生出二进制的目标文件JIECHENG.OBJ,但JIECHENG.OBJ文件不是一个可执行文件,还必须使用连接程序(LINK)把JIECHENG.OBJ文件转换为可执行的JIECHENG.EXE文件。
3.在DOS环境中执行N!
程序
输入:
D:
\huibian>jiecheng.exe
运行结果如图:
4的阶乘为:
24
五.使用DEBUG程序跟踪观察程序的执行过程
1.使用U命令查看JIECHENG.EXE可执行文件的反汇编代码
2.使用T命令查看程序运行的中间步骤
(1)MOVDS,AX,把AX值传送到DS中
(2)把结果RESULT的有效地址传送给寄存器BX
(3)结果地址入栈
(4)N值入栈
(5)递归调用子程序
(6)BP入栈,保存BP值
(7)BP指向帧基地址
(8)BX入栈,保存BX值
(9)BX入栈,保存BX值
(10)取帧中N值
(11)比较N值是否为0
(12)N=0时退出子程序嵌套
(13)为下一次调用压入结果地址
(14)循环次数减1
(15)为下一次调用压入(N-1)值
(16)执行程序,跳出循环
(17)取中间结果(N-1)!
(18)N*(N-1)!
(19)转移到005B处
(20)存储中间结果
3.用R命令查看寄存器中现在的内容
执行PUSHBX结果地址入栈时各寄存器内的内容如下
4.使用G命令连续执行程序,4的阶乘为24
5.Q命令退出DEBUG程序
六.实验总结
通过本次上机实验,我掌握了子程序的设计方法,掌握了子程序的递归调用方法。
本程序是运用递归调用子程序的方法实现求N!
。
在运用U命令、T命令、D命令等的操作来分析过程时,使汇编过程中N!
程序和递归调用子程序的算法思想更加一清二楚,尤其是递归次数的次数变化和递归什么时候结束了解一清二楚。
我相信通过多次上机练习,反复分析讨论汇编过程的命令操作,对我们的汇编能力还是很有帮助的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 子程序设计 阶乘 子程序 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)