汇编语言系列之汇编实现简单数学运算
目录
- 5.计算S=1+2×3+3×4+4×5+···+N(N+1)
- 5.1设计要求:
- 5.2设计思路:
- 5.3程序清单:
- 5.4程序运行结果及分析:
- 6.计算N!
- 6.1设计要求:
- 6.2设计思路:
- 6.3程序清单:
- 6.4程序运行结果及分析:
语言:汇编语言(Assembly)
注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。
5.计算S=1+2×3+3×4+4×5+···+N(N+1)
5.1设计要求:
设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。数值N由加键盘输入,计算结果在显示终端输出。设计要求:计算结果不超过十六位寄存器的存储能力,如有溢出提示错误。
5.2设计思路:
输入N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为十六进制,通过除以10得到十进制,存入堆栈再依次输出。
文章图片
5.3程序清单:
DATA SEGMENTpkeyDB0dh,0ah,"pleas input N end by '; ' :$"overDB0AH,0DH,"overflow!",0dh,0ah,'$'resultDB0dh,0ah,'result is:','$'DAT1DB8 DUP(0)DATA ENDSSTACK SEGMENTSSTACK DB 100 DUP(0)STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK STATE:MOV AX,DATAMOV DS,AXLEA SI,DAT1; 开辟缓冲区LEA DX,pkeyMOV AH,9INT 21H; DOS功能调用,输出字符串LLP:MOV AH,1INT 21H; DOS功能调用,输入N值SUB AL,2FHINC DX; DX计数MOV [SI],AL; 将输入的数据存在SI缓冲区INC SICMP AL,0CH; 输入为封号结束输入JNZ LLPSUB SI,2CMP DX,02H; DX不为2表示输入为两位数JNZ LLLP LLP1:MOV CX,1MOV BL,2; 赋初始值JMP LPLLLP:MOV DI,SISUB DI,1SUB [DI],1MOV AL,10MUL [DI]ADD [SI],AX; 输入是两位数时十位乘10加个位SUB AH,AHJMP LLP1LP: MOV BH,[SI]; 把循环次数给BHMOV AL,BLINC BLMUL BL; BL(加1)和AL(原值)相乘给AXADD CX,AX; AX和CX相加给CX,通过循环实现累加JOOOF; 如果溢出重新输入CMP BH,BL; 判断是否达到N值JNZ LP MOV AX,CXMOV CX,0AHMOV BX,0LOP:MOV DX,0DIV CX; AX表示的32位数除以10,商放在AX,余数放在DXINC BXADD DX,30HPUSH DX; 将余数依次压入栈CMP AX,0JNZ LOP; 商不为0继续除10LEA DX,resultMOV AH,9INT 21H; DOS功能调用,输出字符串OUTPUT:POP DXMOV AH,2INT 21H; DX中数据依次出栈并显示DEC BXJNZ OUTPUT; 出栈完成后停止JMP STATEOOF:LEA DX,overMOV AH,09HINT 21H; DOS功能调用,溢出显示JMP STATE CODE ENDSEND STATE
5.4程序运行结果及分析:
乘法和累加计算根据流程图一步步赋值即可得到,在输入两位数和结果转十进制输出时遇到了麻烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输入两位时移位累加,输出除以10存入堆栈并依次输出显示。
文章图片
【汇编语言系列之汇编实现简单数学运算】图5 计算S=1+2×3+3×4+4×5+···+N(N+1)设计结果
6.计算N!
6.1设计要求:
掌握汇编语言实现高级语言中数学函数的方法。设计程序,实现数学公式N!=N(N-1)(N-2)······2*1的算法。数值N由键盘输入,计算结果在显示终端输出。设计要求:N的范围为0-65535,即不超出16位寄存器的存储容量。
6.2设计思路:
输入N值,通过循环实现阶乘并将计算结果存入AX,然后十六进制转十进制输出。
文章图片
6.3程序清单:
DATA SEGMENT pkeyDB0AH,0DH,"Please Input N(1-8):",'$'result DB0AH,0DH,"the results is:",'$' overDB0AH,0DH,"overflow!",0AH,0DH,'$'DATA ENDSSTACK SEGMENTSSTACK DB 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTATE: MOV AX,DATAMOV DS,AX; 数据段初始化LEA DX,pkeyMOV AH,09HINT 21H; DOS功能调用,显示字符串MOV AH,1INT 21H; DOS功能调用,输入N SUB AL,30HCMP AL,08HJAOOF; 输入大于8溢出 XOR AH,AHMOV BP,AX; 赋循环计数值N给BPLP:MOV BX,BPDEC BXJZLLP; 阶乘次数为BX,BX为0必须马上跳转MUL BX; AX中存放阶乘结果(十六进制转十进制用)DEC BPJNZ LP LLP:MOV CX,0MOV BX,10LLLP:MOV DX,0DIV BX; AX表示的32位数除以10,商放在AX,余数放在DX ADD DX,30HPUSH DX; 将余数转换为ASCII码值并压入栈INC CXCMP AX,0; 商不为0就继续除10JNZ LLLP MOV AH,09HLEA DX,result INT 21H; DOS功能调用,输出字符串LOP:POP DXMOV AH,2INT 21H; DX各位出栈并显示LOOP LOPJMP STATEOOF:LEA DX,overMOV AH,09HINT 21H; DOS功能调用,溢出显示JMP STATE CODE ENDSEND STATE
6.4程序运行结果及分析:
阶乘部分是利用MUL指令AX中存放计算结果并实现阶乘,除阶乘计算部分外,其它部分和第五题类似,同样结果转十进制输出时遇到了麻烦,利用除以10存入堆栈再依次取出并显示来实现。
文章图片
图6 计算N!设计结果
到此这篇关于汇编语言系列之汇编实现简单数学运算的文章就介绍到这了,更多相关汇编语言数学运算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息