本文主要介绍“如何用汇编语言实现简单的数学运算”。在日常操作中,相信很多人对于如何用汇编语言实现简单的数学运算有所疑惑。边肖查阅了各种资料,整理出简单易用的运算方法,希望能帮助大家解答“如何用汇编语言实现简单的数学运算”的疑惑!接下来,请和边肖一起学习!
5.计算S=1+23+34+45++N(N+1)
10-1010,设计了数学公式S=1.234.45 . n(n ^ 1)的算法。n值由键盘输入,计算结果在显示终端输出。设计要求:如果出现溢出提示错误,计算结果不应超过16位寄存器的存储容量。
00-1010,输入n的值再把n给BH作为循环数,通过循环实现乘法和累加。结果是十六进制。除以10得到十进制数,存储在堆栈中,依次输出。
5.1设计要求:
DATASEGMENT
pkeyDB0dh,0ah,' pleasinputendby ';':$'
overDB0AH,0DH,“溢出!”,0dh,0ah,' $ '
resultDB0dh,0ah,' resultis: ',' $ '
DAT1DB8DUP(0)
数据结束
STACKSEGMENT
SSTACKDB100DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
状态:
数据移动
MOVDS,AX
DAT1莱西;打开缓冲区
pkey
MOVAH,9岁
INT21HDOS函数调用,输出字符串
LLP:MOVAH,1
INT21HDOS函数调用,输入n值
SUBAL,2FH
INCDXDX计数
MOV[SI],AL;输入数据存储在SI缓冲器中。
INCSI
CMPAL,0CH输入作为标题的结尾。
JNZLLP
SUBSI,2
CMPDX,02H如果DX不是2,则输入两位数。
(=NationalBureauofStandards)国家标准局
p; JNZ LLLP
LLP1:MOV CX,1
MOV BL,2 ;赋初始值
JMP LP
LLLP:
MOV DI,SI
SUB DI,1
SUB [DI],1
MOV AL,10
MUL [DI]
ADD [SI],AX ;输入是两位数时十位乘10加个位
SUB AH,AH
JMP LLP1
LP: MOV BH,[SI] ;把循环次数给BH
MOV AL,BL
INC BL
MUL BL ;BL(加1)和AL(原值)相乘给AX
ADD CX,AX ;AX和CX相加给CX,通过循环实现累加
JO OOF ;如果溢出重新输入
CMP BH,BL ;判断是否达到N值
JNZ LP
MOV AX,CX
MOV CX,0AH
MOV BX,0
LOP:MOV DX,0
DIV CX ;AX表示的32位数除以10,商放在AX,余数放在DX
INC BX
ADD DX,30H
PUSH DX ;将余数依次压入栈
CMP AX,0
JNZ LOP ;商不为0继续除10
LEA DX,result
MOV AH,9
INT 21H ;DOS功能调用,输出字符串
OUTPUT:
POP DX
MOV AH,2
INT 21H ;DX中数据依次出栈并显示
DEC BX
JNZ OUTPUT ;出栈完成后停止
JMP STATE
OOF:LEA DX,over
MOV AH,09H
INT 21H ;DOS功能调用,溢出显示
JMP STATE
CODE ENDS
END 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 pkey DB 0AH,0DH,"Please Input N(1-8):",'$' result DB 0AH,0DH,"the results is:",'$' over DB 0AH,0DH,"overflow!",0AH,0DH,'$' DATA ENDS STACK SEGMENT SSTACK DB 100 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK STATE: MOV AX,DATA MOV DS,AX ;数据段初始化 LEA DX,pkey MOV AH,09H INT 21H ;DOS功能调用,显示字符串 MOV AH,1 INT 21H ;DOS功能调用,输入N SUB AL,30H CMP AL,08H JA OOF ;输入大于8溢出 XOR AH,AH MOV BP,AX ;赋循环计数值N给BP LP: MOV BX,BP DEC BX JZ LLP ;阶乘次数为BX,BX为0必须马上跳转 MUL BX ;AX中存放阶乘结果(十六进制转十进制用) DEC BP JNZ LP LLP: MOV CX,0 MOV BX,10 LLLP: MOV DX,0 DIV BX ;AX表示的32位数除以10,商放在AX,余数放在DX ADD DX,30H PUSH DX ;将余数转换为ASCII码值并压入栈 INC CX CMP AX,0 ;商不为0就继续除10 JNZ LLLP MOV AH,09H LEA DX,result INT 21H ;DOS功能调用,输出字符串 LOP: POP DX MOV AH,2 INT 21H ;DX各位出栈并显示 LOOP LOP JMP STATE OOF: LEA DX,over MOV AH,09H INT 21H ;DOS功能调用,溢出显示 JMP STATE CODE ENDS END STATE
6.4程序运行结果及分析:
阶乘部分是利用MUL指令AX中存放计算结果并实现阶乘,除阶乘计算部分外,其它部分和第五题类似,同样结果转十进制输出时遇到了麻烦,利用除以10存入堆栈再依次取出并显示来实现。
图6 计算N!设计结果
到此,关于“汇编语言怎么实现简单数学运算”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/123880.html