




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编 求阶乘By: scimence一、汇编 求阶乘1.程序运行基本结果12的阶乘 截图12.程序运行基本结果177的阶乘截图23.说明:本程序苛求去任意阶乘,位数大小受数值字符串tmp的和dos显示界面可以显示的位数的限制二、汇编 源程序DATASSEGMENTSTR1DB0AH, 0DH, - DB0AH, 0DH, Get n!DB0AH, 0DH, -, 0AH, 0DHDB0AH, 0DH, Please input the number, Enter to confirm, 0AH, 0DH,n = , $STR2DB0AH, 0DH, n! = , $tmpDW1, 3000 DUP(-1);定义一个存储空间用于运行过程中临时存储数据,存储求得的阶乘tmpHDW3000 DUP(0);存储操作过程中相对于10000的商tmpLDW3000 DUP(0);存储操作过程中相对于10000的余数DATASENDSCODESSEGMENTASSUMECS: CODES, DS: DATAS;宏定义 字符输入charinMACRO;宏定义无参数的字符输入功能MOV AH, 01H;系统调用 输入一个字符用于功能选择INT 21H;字符默认输入到AL中ENDM;宏定义 字符输出charoutMACROoutchar;宏定义 将字符outchar输出PUSH AXPUSH DXMOV DL, outcharMOV AH, 02H;系统调用 输出字符outcharINT 21H;调用系统中断 调用过程中会改变AL中的值,故将AX中的值入栈保存POP DXPOP AXENDM;宏定义 字符串输出stroutMACRO STRINGOUT;将字符串STRINGOUT输出PUSH AXPUSH BXPUSH CXPUSH DXLEA DX, STRINGOUT;将STRIN的偏移地址送到DX寄存器MOV AH, 9;09H字符串输出功能INT 21H;调用系统中断POP DXPOP CXPOP BXPOP AXENDM;宏定义 以baseNum进制输出AX中的数值outAXMACRObaseNum;宏定义换行PUSH AXPUSH BXPUSH CXPUSH DXMOV BX, baseNum;将要转换成的进制存入BX作为除数CALL outAXp;调用进制输出过程POP DXPOP CXPOP BXPOP AXENDM;过程定义以baseNum进制形式输出存放在AX中的数值过程outAXpPROCMOV DX, 0;初始化DX配合AX一起进行处罚操作MOV CX, 0;用CX计数取得个余数个数CMP AX, 0;判断AX中的值是否为0JNEoutAXp_Circlecharout 0JMPoutAXpExit0outAXp_Circle:CMP AX, 0;判断AX中的值是否为0JE outAXp_NEXT;是则跳转DIV BX;不是则进行除10运算 商保存在AX中 余数保存在DX中PUSH DX;将对10取到的余数入栈保存MOV DX, 0;将DX中的余数清空 以便下一步对AX中的数进行除10运算INC CX;计数循环取得的余数个数JMP outAXp_CircleoutAXp_NEXT:;循环输出取得的余数POP AXCMP AL, 10;当余数小于10时,直接将数值输出JB noutADD AL, 55;否则将余数转化为对应的字符10对应字符Acharout ALJMP coutnout:ADD AL, 30Hcharout ALcout:LOOP outAXp_NEXToutAXpExit0:REToutAXpENDP;宏定义 以baseNum进制输入数据串到AX中,可输入2-37进制inAXMACRObaseNum;宏定义换行PUSH BXPUSH CXPUSH DXMOV CX, baseNum;将要转换成的进制存入BX作为除数CALL inAXp;调用进制输入过程POP DXPOP CXPOP BXENDM;过程定义以baseNum进制形式输出存放在AX中的数值过程inAXpPROCMOVAX,0inAXp0:PUSH AXinAXp1:charin;逐个字符进行输入, 结果存放到AX中CMP AL, 13JEinAXE;当按下Enter键后跳转AX的输出CMP AL, 0JBinAXp1;当输入字符小于0时,跳转inAXp1,跳转重新进行字符输入CMP AL, 9JAinAXnext1;当输入字符大于9时,跳转inAXnext1进一步进行比较SUBAL, 48;当字符在0-9之间时,将字符转化为对应的数值JMP inAXnum;跳转数值输入inAXnext1:CMP AL, AJBinAXp1;当输入字符小于A时,跳转重新进行字符输入CMP AL, ZJAinAXnext2;当输入字符大于Z时,跳转inAXnext2进一步进行比较SUBAL, 55;当字符在A-Z之间时,将字符转化为对应的数值,并跳转到数值输入JMP inAXnuminAXnext2:CMP AL, aJBinAXp1;当输入字符小于A时,跳转重新进行字符输入CMP AL, zJAinAXp1;当输入字符小于A时,跳转重新进行字符输入SUBAL, 87;当字符在a-z之间时,将字符转化为对应的数值,并跳转到数值输入JMP inAXnuminAXnum:MOV BH, 0;将数值送到AX中MOV BL, ALPOPAXCMP AX, 0;当AX中的数值为0时,跳过乘法操作JEinAXaddMUL CX;乘以CX中的进制基数inAXadd:ADD AX, BXJMP inAXp0inAXE:POPAX;将计算得到的数值出栈到AX中RETinAXpENDP;宏定义 换行endlMACRO;宏定义换行PUSH AXPUSH BXPUSH CXPUSH DXMOV DL, 0AH;先输出垂直Tab键MOV AH, 2INT 21H;调用系统中断实现输出MOV DL, 0DH;再将输出输出调至段首INT 21H;调用系统中断POP DXPOP CXPOP BXPOP AXENDM;宏定义 输出字符串NumStr所表示的数值,输出的数值字符串必须以-1结尾outNumMACRONumStrPUSH AXPUSH BXPUSH CXPUSH DXPUSH SILEABX, NumStr;用BX存储字符串NumStr在DS中的首地址CALL outNump;调用字符串NumStr数值输出过程POP SIPOP DXPOP CXPOP BXPOP AXENDM;过程定义输出字符串NumStr所表示的数值过程outNumpPROCoutNumStr:;将NumStr中的字符串数值输出MOV SI, -2toTmpEnd:;使SI指向tmp的数值结尾处ADD SI, 2MOV AX, BX+SI;取出tmp中的数值到AX中CMP AX, -1JNEtoTmpEnd;SI未到达tmp中的数值的结尾处时,跳转SUB SI, 2CMP SI, -2JEoutNumpRetMOV AX, BX+SI;取出tmp中的第一个数值到AX中outAX10;将AX中的数以10进制形式输出outNumStrNext:SUB SI, 2CMP SI, -2JEoutNumpRetMOV AX, BX+SI;取出tmp中的数值到AX中CMP AX, 1000JAEoutNumStroutAX;AX中的数值大于等于1000时跳转charout 0;AX小于1000时先输出一个字符0CMP AX, 100JAEoutNumStroutAXcharout 0;AX小于100时再输出一个字符0CMP AX, 10JAEoutNumStroutAXcharout 0;AX小于10时再输出一个字符0outNumStroutAX:outAX10;将AX中的数以10进制形式输出JMP outNumStrNext;跳转进行下一位数值的输出outNumpRet:REToutNumpENDPSTART:MOV AX, DATAS;将数据段地址送到AX中MOV DS, AX;由AX转送到送到DSstrout STR1;字符串输出宏调用 输出字符串STR61inAX10;以10进制的形式输入要求阶乘的数到AX中MOV CX, AX;求阶乘的数转至CX中strout STR2;字符串输出宏调用 输出字符串STR62inTmp:;求取CX的阶乘,并将结果存储到tmp中MOV BX, 1;BX逐步求阶的乘数inTmpNext:CMP CX, 0JEouttmp;当CX中的值为0时,输出tmp中的数值PUSH CXMOV SI, 0;SI指向tmp的起始位置multmp:;对tmp中的所有数值进行乘BX操作,乘积大于等于10000的部分存储到tmpH中,小于10000的部分存储到tmpL中MOV AX, tmpSI;取出tmp中的数值到AX中CMP AX, -1JEshiftTmp;直到取得的数值为0时,跳转MUL BX;进行乘法操作PUSH CXMOV CX, 10000DIV CX;除法操作 除以10000POP CXMOV tmpLSI, DX;将余数存储到tmpL中ADD SI, 2MOV tmpHSI, AX;将商存储到tmpH中JMPmultmpshiftTmp:;对tmp乘以BX得到的数值字符串tmpL和tmpH,进行格式调整,并将调整后的结果存储到tmp中去PUSH BX;BX中的乘数入栈保存MOV BX, 0MOV SI, 2shiftTmpNext:MOV AX, tmpBX;取出tmp中的数值到AX中CMP AX, -1JEshiftTmpEnd;当tmp中的数值取完时,跳转MOV AX, tmpHBX;取商到AX中ADD AX,tmpLBX;加上此时所在位置对应的余数CMP AX, 10000;判断AX中的数值是否大于10000JB movetoTMp;小于10000时直接将数值存储到tmp中MOV DX, 0;大于10000时,将大于等于10000的部分存到高位的进位中去,小于10000的部分存储到tmp中PUSH CXMOV CX, 10000DIV CXPOPCXMOV tmpBX, DX;小于10000的余数部分存储到tmp中ADD tmpHSI, AX;大于10000的高位部分添加到高位的进位中去ADD BX, 2;指针后移指向下一个数值ADD SI, 2JMPshiftTmpNextmovetoTMp:MOV tmpBX, AX;将数值存储到tmp中ADD BX, 2;指针后移指向下一个数值ADD SI, 2JMPshiftTm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年软件工程师面试指南与历年模拟题解析
- 2025年高级殡葬火化师职业素养与技能面试题详解
- 2025年残联组织建设干事招聘考试模拟题及答题技巧
- 香囊风寒防治研究-洞察及研究
- 无纺布行业知识培训总结
- 2025年人力资源总监招聘面试实战模拟题
- 物理-湖南师大附中 2025 届高三月考试卷(六)试题和答案
- 高中信息技术 5.1.1 多媒体技术的发展与应用说课稿 教科版
- 学位面试题目及答案解析
- 徐州液压面试题目及答案
- 血液透析中出血的原因及预防
- 珠宝品牌价值构建-深度研究
- 预备役退出申请书
- 三农村集体经济组织内部审计操作手册
- 2025年1月浙江省高考地理试卷(含答案)
- 锂电池项目经济效益及投资价值分析
- 2025年中国维生素C咀嚼片市场供需格局及未来发展趋势报告
- 广东省汕头市金平区2021-2022学年八年级下学期期末英语卷
- 物流行业固废处理方案
- 测绘项目投标技术文件范例
- 项目5 5.1 植物的光合作用(1)(课件)-《植物生产与环境》(高教版第4版)
评论
0/150
提交评论