汇编 求任意阶乘.docx

上传人:小飞机 文档编号:3613241 上传时间:2023-03-14 格式:DOCX 页数:17 大小:40.06KB
返回 下载 相关 举报
汇编 求任意阶乘.docx_第1页
第1页 / 共17页
汇编 求任意阶乘.docx_第2页
第2页 / 共17页
汇编 求任意阶乘.docx_第3页
第3页 / 共17页
汇编 求任意阶乘.docx_第4页
第4页 / 共17页
汇编 求任意阶乘.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《汇编 求任意阶乘.docx》由会员分享,可在线阅读,更多相关《汇编 求任意阶乘.docx(17页珍藏版)》请在三一办公上搜索。

1、汇编 求任意阶乘汇编 求阶乘 By: scimence 一、汇编 求阶乘 1.程序运行基本结果12的阶乘 截图1 2.程序运行基本结果177的阶乘截图2 3.说明:本程序苛求去任意阶乘,位数大小受数值字符串tmp的和dos显示界面可以显示的位数的限制 汇编 求阶乘 By: scimence 二、汇编 源程序 DATAS SEGMENT STR1 DB 0AH, 0DH, - DB 0AH, 0DH, DB 0AH, 0DH, Get n! -, 0AH, 0DH DB 0AH, 0DH, Please input the number, Enter to confirm, 0AH, 0DH,n

2、 = , $ STR2 DB 0AH, 0DH, n! = , $ tmp DW 1, 3000 DUP(-1) ;定义一个存储空间用于运行过程中临时存储数据,存储求得的阶乘 tmpH DW 3000 DUP(0) tmpL DW 3000 DUP(0) DATAS ENDS CODES SEGMENT ASSUME CS: CODES, DS: DATAS ;存储操作过程中相对于10000的商 ;存储操作过程中相对于10000的余数 汇编 求阶乘 By: scimence ;宏定义 字符输入 charin MACRO MOV AH, 01H INT 21H ENDM ;宏定义 字符输出 ch

3、arout MACRO outchar PUSH AX PUSH DX MOV DL, outchar MOV AH, 02H INT 21H 将AX中的值入栈保存 POP DX POP AX ENDM ;宏定义 字符串输出 strout MACRO STRINGOUT PUSH AX PUSH BX ;宏定义无参数的字符输入功能 ;系统调用 输入一个字符用于功能选择 ;字符默认输入到AL中 ;宏定义 将字符outchar输出 ;系统调用 输出字符outchar ;调用系统中断 调用过程中会改变AL中的值,故;将字符串STRINGOUT输出 汇编 求阶乘 By: scimence PUSH C

4、X PUSH DX LEA DX, STRINGOUT MOV AH, 9 INT 21H POP DX POP CX POP BX POP AX ;将STRIN的偏移地址送到DX寄存器 ;09H字符串输出功能 ;调用系统中断 ENDM ;宏定义 以baseNum进制输出AX中的数值 outAX MACRO baseNum PUSH AX PUSH BX PUSH CX PUSH DX MOV BX, baseNum CALL outAXp ;将要转换成的进制存入BX作为除数 ;调用进制输出过程 ;宏定义换行 汇编 求阶乘 By: scimence POP DX POP CX POP BX P

5、OP AX ENDM ;过程定义 以baseNum进制形式输出存放在AX中的数值过程 outAXp PROC MOV DX, 0 MOV CX, 0 CMP AX, 0 JNE ;判断AX中的值是否为0 ;初始化DX配合AX一起进行处罚操作 ;用CX计数取得个余数个数 outAXp_Circle charout 0 JMP outAXpExit0 outAXp_Circle: CMP AX, 0 ;判断AX中的值是否为0 ;是则跳转 JE outAXp_NEXT DIV BX ;不是则进行除10运算 商保存在AX中 余数保存在DX中 PUSH DX ;将对10取到的余数入栈保存 汇编 求阶乘

6、By: scimence MOV DX, 0 行除10运算 INC CX JMP outAXp_Circle outAXp_NEXT: POP AX CMP AL, 10 JB nout ADD AL, 55 charout AL JMP cout nout: ADD AL, 30H charout AL cout: LOOP outAXp_NEXT outAXpExit0: RET outAXp ENDP ;将DX中的余数清空 以便下一步对AX中的数进;计数循环取得的余数个数 ;循环输出取得的余数 ;当余数小于10时,直接将数值输出 ;否则将余数转化为对应的字符10对应字符A 汇编 求阶乘

7、By: scimence ;宏定义 以baseNum进制输入数据串到AX中,可输入2-37进制 inAX MACRO baseNum PUSH BX PUSH CX PUSH DX MOV CX, baseNum CALL inAXp POP DX POP CX POP BX ;将要转换成的进制存入BX作为除数 ;调用进制输入过程 ;宏定义换行 ENDM ;过程定义 以baseNum进制形式输出存放在AX中的数值过程 inAXp PROC MOV AX, 0 inAXp0: PUSH AX inAXp1: charin ;逐个字符进行输入, 结果存放到AX中 CMP AL, 13 JE inA

8、XE CMP AL, 0 JB inAXp1 ;当输入字符小于0时,跳转inAXp1,跳转重新;当按下Enter键后跳转AX的输出 汇编 求阶乘 By: scimence 进行字符输入 CMP AL, 9 JA inAXnext1 行比较 SUB AL, 48 的数值 JMP inAXnum inAXnext1: CMP AL, A JB inAXp1 CMP AL, Z JA inAXnext2 行比较 SUB AL, 55 的数值,并跳转到数值输入 JMP inAXnum inAXnext2: CMP AL, a JB inAXp1 CMP AL, z ;当输入字符大于9时,跳转inAXn

9、ext1进一步进;当字符在0-9之间时,将字符转化为对应;跳转数值输入 ;当输入字符小于A时,跳转重新进行字符输入 ;当输入字符大于Z时,跳转inAXnext2进一步进;当字符在A-Z之间时,将字符转化为对应;当输入字符小于A时,跳转重新进行字符输入 汇编 求阶乘 By: scimence JA inAXp1 SUB AL, 87 的数值,并跳转到数值输入 JMP inAXnum inAXnum:MOV BH, 0 MOV BL, AL POP AX CMP AX, 0 JE inAXadd MUL CX inAXadd:ADD AX, BX JMP inAXp0 inAXE: POP AX

10、RET inAXp ENDP ;宏定义 换行 endl MACRO ;当输入字符小于A时,跳转重新进行字符输入 ;当字符在a-z之间时,将字符转化为对应;将数值送到AX中 ;当AX中的数值为0时,跳过乘法操作 ;乘以CX中的进制基数 ;将计算得到的数值出栈到AX中 ;宏定义换行 汇编 求阶乘 By: scimence PUSH AX PUSH BX PUSH CX PUSH DX MOV DL, 0AH MOV AH, 2 INT 21H ;调用系统中断实现输出 ;再将输出输出调至段首 ;先输出垂直Tab键 MOV DL, 0DH INT 21H POP DX POP CX POP BX PO

11、P AX ;调用系统中断 ENDM ;宏定义 输出字符串NumStr所表示的数值,输出的数值字符串必须以-1结尾 outNum MACRO NumStr PUSH AX 汇编 求阶乘 By: scimence PUSH BX PUSH CX PUSH DX PUSH SI LEA CALL outNump POP SI POP DX POP CX POP BX POP AX ;调用字符串NumStr数值输出过程 BX, NumStr ;用BX存储字符串NumStr在DS中的首地址 ENDM ;过程定义 输出字符串NumStr所表示的数值过程 outNump PROC outNumStr: MO

12、V SI, -2 ;使SI指向tmp的数值结尾处 ;将NumStr中的字符串数值输出 toTmpEnd: ADD SI, 2 MOV AX, BX+SI ;取出tmp中的数值到AX中 汇编 求阶乘 By: scimence CMP AX, -1 JNE toTmpEnd SUB SI, 2 CMP SI, -2 JE outNumpRet MOV AX, BX+SI outAX 10 outNumStrNext: SUB SI, 2 CMP SI, -2 JE outNumpRet MOV AX, BX+SI CMP AX, 1000 JAE outNumStroutAX charout 0

13、CMP AX, 100 JAE outNumStroutAX charout 0 CMP AX, 10 JAE outNumStroutAX ;SI未到达tmp中的数值的结尾处时,跳转 ;取出tmp中的第一个数值到AX中 ;将AX中的数以10进制形式输出 ;取出tmp中的数值到AX中 ;AX中的数值大于等于1000时跳转 ;AX小于1000时先输出一个字符0 ;AX小于100时再输出一个字符0 汇编 求阶乘 By: scimence charout 0 outNumStroutAX: outAX 10 JMP outNumStrNext outNumpRet: RET outNump ENDP

14、 START: MOV AX, DATAS MOV DS, AX strout STR1 inAX 10 MOV CX, AX strout STR2 ;AX小于10时再输出一个字符0 ;将AX中的数以10进制形式输出 ;跳转进行下一位数值的输出 ;将数据段地址送到AX中 ;由AX转送到送到DS ;字符串输出宏调用 输出字符串STR61 ;以10进制的形式输入要求阶乘的数到AX中 ;求阶乘的数转至CX中 ;字符串输出宏调用 输出字符串STR62 汇编 求阶乘 By: scimence ;求取CX的阶乘,并将结果存储到tmp中 ;BX逐步求阶的乘数 inTmp: MOV BX, 1 inTmpN

15、ext: CMP CX, 0 JE outtmp PUSH CX ;SI指向tmp的起始位置 ;对tmp中的所有数值进行乘BX操作,乘积;当CX中的值为0时,输出tmp中的数值 MOV SI, 0 multmp: 大于等于10000的部分存储到tmpH中,小于10000的部分存储到tmpL中 MOV AX, tmpSI CMP AX, -1 JE shiftTmp MUL BX PUSH CX MOV CX, 10000 DIV CX POP CX ;除法操作 除以10000 ;直到取得的数值为0时,跳转 ;进行乘法操作 ;取出tmp中的数值到AX中 汇编 求阶乘 By: scimence M

16、OV tmpLSI, DX ADD SI, 2 MOV tmpHSI, AX JMP multmp ;将余数存储到tmpL中 ;将商存储到tmpH中 ;对tmp乘以BX得到的数值字符串tmpL和shiftTmp: tmpH,进行格式调整,并将调整后的结果存储到tmp中去 PUSH BX MOV BX, 0 MOV SI, 2 ;BX中的乘数入栈保存 shiftTmpNext: MOV AX, tmpBX CMP AX, -1 JE shiftTmpEnd MOV AX, tmpHBX ADD AX, ;取商到AX中 ;加上此时所在位置对应的余数 ;当tmp中的数值取完时,跳转 ;取出tmp中的

17、数值到AX中 tmpLBX 汇编 求阶乘 By: scimence CMP AX, 10000 JB movetoTMp MOV DX, 0 ;判断AX中的数值是否大于10000 ;小于10000时直接将数值存储到tmp中 ;大于10000时,将大于等于10000的部分存到高位的进位中去,小于10000的部分存储到tmp中 PUSH CX MOV CX, 10000 DIV CX POP CX ;小于10000的余数部分存储到tmp中 MOV tmpBX, DX ADD tmpHSI, AX ADD BX, 2 ADD SI, 2 JMP shiftTmpNext ;大于10000的高位部分添

18、加到高位的进位中去 ;指针后移指向下一个数值 movetoTMp: MOV tmpBX, AX ADD BX, 2 ADD SI, 2 JMP shiftTmpNext ;将数值存储到tmp中 ;指针后移指向下一个数值 汇编 求阶乘 By: scimence shiftTmpEnd: MOV AX, tmpHBX CMP AX, 0 JE skipMov MOV tmpBX, AX skipMov: POP BX INC BX POP CX LOOP inTmpNext outtmp: outNum tmp endl exit: MOV AH, 4CH INT 21H CODES ENDS END START ;取出上一个商到AX中 ;若AX中的数值为0时,跳过下一步 ;将上一位的商添加到tmp中 ;BX中的数值出栈 ;输出数值字符串所表示的数值 ;调用 系统结束 汇编 求阶乘 By: scimence

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号