汇编语言系列之汇编实现简单数学运算

目录
  • 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程序运行结果及分析:

软件: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!设计结果

到此这篇关于汇编语言系列之汇编实现简单数学运算的文章就介绍到这了,更多相关汇编语言数学运算内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐