汇编语言系列之汇编实现简单数学运算
程序员文章站
2022-06-19 10:50:10
目录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...
软件:emu8086
语言:汇编语言(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 segment pkey db 0dh,0ah,"pleas input n end by ';' :$" over db 0ah,0dh,"overflow!",0dh,0ah,'$' result db 0dh,0ah,'result is:','$' dat1 db 8 dup(0) 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 si,dat1 ;开辟缓冲区 lea dx,pkey mov ah,9 int 21h ;dos功能调用,输出字符串 llp:mov ah,1 int 21h ;dos功能调用,输入n值 sub al,2fh inc dx ;dx计数 mov [si],al ;将输入的数据存在si缓冲区 inc si cmp al,0ch ;输入为封号结束输入 jnz llp sub si,2 cmp dx,02h ;dx不为2表示输入为两位数 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!设计结果
到此这篇关于汇编语言系列之汇编实现简单数学运算的文章就介绍到这了,更多相关汇编语言数学运算内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!