欢迎来到天天文库
浏览记录
ID:30030759
大小:177.50 KB
页数:4页
时间:2018-12-26
《汇编子程序设计阶乘》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、1.N!程序描述在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。显然递归调用是子程序嵌套的一种特殊情况。使用递归算法往往能设计出效率较高的程序。递归调用最简单例子是计算阶乘。求N!本身是一个子程序,由于N!是N和(N-1)!的乘积,所以为求(N-1)!必须递归调用求N!的子程序,只是每次调用所使用的参数不同而已。2.N!程序流程图443.N!源程序STACKSGSEGMENTSTACK'S';定义堆栈DW128DUP('ST')STACKSGENDSDATASEGMENTN_
2、VALDW4;定义N值RESULTDW?;结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSGFRAMESTRUC;定义帧结构SAV_BPDW?;保存BP值SAV_CS_IPDW2DUP(?);保存返回地址NDW?;当前N值RESULT_ADDRDW?;结果地址FRAMEENDSMAINPROCFARMOVAX,DATAMOVDS,AXLEABX,RESULTPUSHBX;结果地址入栈PUSHN_VAL;N值入栈CALLFARPTRFACT;调用递归子程序MOV
3、CL,10MOVAX,RESULTDIVCL;把阶乘结果转换成十进制数ORAX,3030H;转换成ASCII码MOVDL,ALMOVAH,2;显示结果的高位INT21HMOVAX,RESULTDIVCL;把阶乘结果转换成十进制数ORAX,3030H;转换成ASCII码MOVDL,AHMOVAH,2;显示结果的低位INT21HR1:MOVAX,4C00H4INT21HMAINENDPFACTPROCFAR;N!递归子程序PUSHBP;保存BP值MOVBP,SP;BP指向帧基地址PUSHBXPUSHAXMOVBX,[B
4、P].RESULT_ADDRMOVAX,[BP].N;取帧中N值CMPAX,0JEDONE;N=0时退出子程序嵌套PUSHBX;为下一次调用压入结果地址DECAXPUSHAX;为下一次调用压入(N-1)值CALLFARPTRFACTR2:MOVBX,[BP].RESULT_ADDRMOVAX,[BX];取中间结果(N-1)!MUL[BP].N;N*(N-1)!JMPSHORTRETURNDONE:MOVAX,1;0!=1RETURN:MOV[BX],AX;存中间结果POPAXPOPBXPOPBPRET4FACTEN
5、DPCODEENDSENDMAIN4
此文档下载收益归作者所有