汇编 求任意阶乘.docx
- 文档编号:10821955
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:14
- 大小:41.02KB
汇编 求任意阶乘.docx
《汇编 求任意阶乘.docx》由会员分享,可在线阅读,更多相关《汇编 求任意阶乘.docx(14页珍藏版)》请在冰豆网上搜索。
汇编求任意阶乘
一、汇编求阶乘
1.程序运行基本结果12的阶乘截图1
2.程序运行基本结果177的阶乘截图2
3.说明:
本程序苛求去任意阶乘,位数大小受数值字符串tmp的和dos显示界面可以显示的位数的限制
二、汇编源程序
DATASSEGMENT
STR1DB0AH,0DH,'-----------------------------------------'
DB0AH,0DH,'Getn!
'
DB0AH,0DH,'-----------------------------------------',0AH,0DH
DB0AH,0DH,'Pleaseinputthenumber,Entertoconfirm',0AH,0DH,'n=','$'
STR2DB0AH,0DH,'n!
=','$'
tmpDW1,3000DUP(-1);定义一个存储空间用于运行过程中临时存储数据,存储求得的阶乘
tmpHDW3000DUP(0);存储操作过程中相对于10000的商
tmpLDW3000DUP(0);存储操作过程中相对于10000的余数
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
;宏定义字符输入
charinMACRO;宏定义无参数的字符输入功能
MOVAH,01H;系统调用输入一个字符用于功能选择
INT21H;字符默认输入到AL中
ENDM
;宏定义字符输出
charoutMACROoutchar;宏定义将字符outchar输出
PUSHAX
PUSHDX
MOVDL,outchar
MOVAH,02H;系统调用输出字符outchar
INT21H;调用系统中断调用过程中会改变AL中的值,故将AX中的值入栈保存
POPDX
POPAX
ENDM
;宏定义字符串输出
stroutMACROSTRINGOUT;将字符串STRINGOUT输出
PUSHAX
PUSHBX
PUSHCX
PUSHDX
LEADX,STRINGOUT;将STRIN的偏移地址送到DX寄存器
MOVAH,9;09H字符串输出功能
INT21H;调用系统中断
POPDX
POPCX
POPBX
POPAX
ENDM
;宏定义以baseNum进制输出AX中的数值
outAXMACRObaseNum;宏定义换行
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVBX,baseNum;将要转换成的进制存入BX作为除数
CALLoutAXp;调用进制输出过程
POPDX
POPCX
POPBX
POPAX
ENDM
;过程定义以baseNum进制形式输出存放在AX中的数值过程
outAXpPROC
MOVDX,0;初始化DX配合AX一起进行处罚操作
MOVCX,0;用CX计数取得个余数个数
CMPAX,0;判断AX中的值是否为0
JNEoutAXp_Circle
charout'0'
JMPoutAXpExit0
outAXp_Circle:
CMPAX,0;判断AX中的值是否为0
JEoutAXp_NEXT;是则跳转
DIVBX;不是则进行除10运算商保存在AX中余数保存在DX中
PUSHDX;将对10取到的余数入栈保存
MOVDX,0;将DX中的余数清空以便下一步对AX中的数进行除10运算
INCCX;计数循环取得的余数个数
JMPoutAXp_Circle
outAXp_NEXT:
;循环输出取得的余数
POPAX
CMPAL,10;当余数小于10时,直接将数值输出
JBnout
ADDAL,55;否则将余数转化为对应的字符10对应字符'A'
charoutAL
JMPcout
nout:
ADDAL,30H
charoutAL
cout:
LOOPoutAXp_NEXT
outAXpExit0:
RET
outAXpENDP
;宏定义以baseNum进制输入数据串到AX中,可输入2-37进制
inAXMACRObaseNum;宏定义换行
PUSHBX
PUSHCX
PUSHDX
MOVCX,baseNum;将要转换成的进制存入BX作为除数
CALLinAXp;调用进制输入过程
POPDX
POPCX
POPBX
ENDM
;过程定义以baseNum进制形式输出存放在AX中的数值过程
inAXpPROC
MOVAX,0
inAXp0:
PUSHAX
inAXp1:
charin;逐个字符进行输入,结果存放到AX中
CMPAL,13
JEinAXE;当按下Enter键后跳转AX的输出
CMPAL,'0'
JBinAXp1;当输入字符小于'0'时,跳转inAXp1,跳转重新进行字符输入
CMPAL,'9'
JAinAXnext1;当输入字符大于'9'时,跳转inAXnext1进一步进行比较
SUBAL,48;当字符在'0'-'9'之间时,将字符转化为对应的数值
JMPinAXnum;跳转数值输入
inAXnext1:
CMPAL,'A'
JBinAXp1;当输入字符小于'A'时,跳转重新进行字符输入
CMPAL,'Z'
JAinAXnext2;当输入字符大于'Z'时,跳转inAXnext2进一步进行比较
SUBAL,55;当字符在'A'-'Z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMPinAXnum
inAXnext2:
CMPAL,'a'
JBinAXp1;当输入字符小于'A'时,跳转重新进行字符输入
CMPAL,'z'
JAinAXp1;当输入字符小于'A'时,跳转重新进行字符输入
SUBAL,87;当字符在'a'-'z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMPinAXnum
inAXnum:
MOVBH,0;将数值送到AX中
MOVBL,AL
POPAX
CMPAX,0;当AX中的数值为0时,跳过乘法操作
JEinAXadd
MULCX;乘以CX中的进制基数
inAXadd:
ADDAX,BX
JMPinAXp0
inAXE:
POPAX;将计算得到的数值出栈到AX中
RET
inAXpENDP
;宏定义换行
endlMACRO;宏定义换行
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVDL,0AH;先输出垂直Tab键
MOVAH,2
INT21H;调用系统中断实现输出
MOVDL,0DH;再将输出输出调至段首
INT21H;调用系统中断
POPDX
POPCX
POPBX
POPAX
ENDM
;宏定义输出字符串NumStr所表示的数值,输出的数值字符串必须以-1结尾
outNumMACRONumStr
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
LEABX,NumStr;用BX存储字符串NumStr在DS中的首地址
CALLoutNump;调用字符串NumStr数值输出过程
POPSI
POPDX
POPCX
POPBX
POPAX
ENDM
;过程定义输出字符串NumStr所表示的数值过程
outNumpPROC
outNumStr:
;将NumStr中的字符串数值输出
MOVSI,-2
toTmpEnd:
;使SI指向tmp的数值结尾处
ADDSI,2
MOVAX,[BX+SI];取出tmp中的数值到AX中
CMPAX,-1
JNEtoTmpEnd;SI未到达tmp中的数值的结尾处时,跳转
SUBSI,2
CMPSI,-2
JEoutNumpRet
MOVAX,[BX+SI];取出tmp中的第一个数值到AX中
outAX10;将AX中的数以10进制形式输出
outNumStrNext:
SUBSI,2
CMPSI,-2
JEoutNumpRet
MOVAX,[BX+SI];取出tmp中的数值到AX中
CMPAX,1000
JAEoutNumStroutAX;AX中的数值大于等于1000时跳转
charout'0';AX小于1000时先输出一个字符'0'
CMPAX,100
JAEoutNumStroutAX
charout'0';AX小于100时再输出一个字符'0'
CMPAX,10
JAEoutNumStroutAX
charout'0';AX小于10时再输出一个字符'0'
outNumStroutAX:
outAX10;将AX中的数以10进制形式输出
JMPoutNumStrNext;跳转进行下一位数值的输出
outNumpRet:
RET
outNumpENDP
START:
MOVAX,DATAS;将数据段地址送到AX中
MOVDS,AX;由AX转送到送到DS
stroutSTR1;字符串输出宏调用输出字符串STR61
inAX10;以10进制的形式输入要求阶乘的数到AX中
MOVCX,AX;求阶乘的数转至CX中
stroutSTR2;字符串输出宏调用输出字符串STR62
inTmp:
;求取CX的阶乘,并将结果存储到tmp中
MOVBX,1;BX逐步求阶的乘数
inTmpNext:
CMPCX,0
JEouttmp;当CX中的值为0时,输出tmp中的数值
PUSHCX
MOVSI,0;SI指向tmp的起始位置
multmp:
;对tmp中的所有数值进行乘BX操作,乘积大于等于10000的部分存储到tmpH中,小于10000的部分存储到tmpL中
MOVAX,tmp[SI];取出tmp中的数值到AX中
CMPAX,-1
JEshiftTmp;直到取得的数值为0时,跳转
MULBX;进行乘法操作
PUSHCX
MOVCX,10000
DIVCX;除法操作除以10000
POPCX
MOVtmpL[SI],DX;将余数存储到tmpL中
ADDSI,2
MOVtmpH[SI],AX;将商存储到tmpH中
JMPmultmp
shiftTmp:
;对tmp乘以BX得到的数值字符串tmpL和tmpH,进行格式调整,并将调整后的结果存储到tmp中去
PUSHBX;BX中的乘数入栈保存
MOVBX,0
MOVSI,2
shiftTmpNext:
MOVAX,tmp[BX];取出tmp中的数值到AX中
CMPAX,-1
JEshiftTmpEnd;当tmp中的数值取完时,跳转
MOVAX,tmpH[BX];取商到AX中
ADDAX,tmpL[BX];加上此时所在位置对应的余数
CMPAX,10000;判断AX中的数值是否大于10000
JBmovetoTMp;小于10000时直接将数值存储到tmp中
MOVDX,0;大于10000时,将大于等于10000的部分存到高位的进位中去,小于10000的部分存储到tmp中
PUSHCX
MOVCX,10000
DIVCX
POPCX
MOVtmp[BX],DX;小于10000的余数部分存储到tmp中
ADDtmpH[SI],AX;大于10000的高位部分添加到高位的进位中去
ADDBX,2;指针后移指向下一个数值
ADDSI,2
JMPshiftTmpNext
movetoTMp:
MOVtmp[BX],AX;将数值存储到tmp中
ADDBX,2;指针后移指向下一个数值
ADDSI,2
JMPshiftTmpNext
shiftTmpEnd:
MOVAX,tmpH[BX];取出上一个商到AX中
CMPAX,0
JEskipMov;若AX中的数值为0时,跳过下一步
MOVtmp[BX],AX;将上一位的商添加到tmp中
skipMov:
POPBX;BX中的数值出栈
INCBX
POPCX
LOOPinTmpNext
outtmp:
;输出数值字符串所表示的数值
outNumtmp
endl
exit:
MOVAH,4CH;调用系统结束
INT21H
CODESENDS
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 求任意阶乘 任意 阶乘