汇编 子程序设计 阶乘文档格式.docx
- 文档编号:17009022
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:11
- 大小:1.01MB
汇编 子程序设计 阶乘文档格式.docx
《汇编 子程序设计 阶乘文档格式.docx》由会员分享,可在线阅读,更多相关《汇编 子程序设计 阶乘文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
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
把阶乘结果转换成十进制数
MOVDL,AH
MOVAH,2;
显示结果的低位
R1:
MOVAX,4C00H
INT21H
MAINENDP
FACTPROCFAR;
N!
递归子程序
PUSHBP;
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 子程序设计 阶乘 子程序 设计