汇编代码--完成两个十进制数的减、乘、除、取余

1.要求

在输入窗口中,实现两个十进制数的输入,根据用户的输入不同标号,可以设计选择转移结构,完成如下几种子程序:

子程序1 如上输入的两位十进制数进行相减;

子程序2 如上输入的两位十进制数进行相乘;

子程序3  如上输入的两位十进制数进行相除;

子程序4  如上输入的两位十进制数进行取余;

请根据要求设计程序结构及其思路,请对于各个子程序给出代码,及其正确的运行结果。

2.思路:

  由于前几次某个实验中曾经做过输入转十进制(并且可以检测是否输入),这里可以直接复制以前写的子程序代码。思考重点放在计算结果转十进制输出上,通过不断对结果除于10取余数(得到的余数作为下一次的被除数)保存到栈中,计算完之后把栈中的数据弹出放到dx寄存器中并打印。至于选择哪种计算方法,可以使用多分支程序调用不同的子程序,类似与高级语言中的switch。

data segment
  X dw ?
  Y dw ?
  Fun dw ?
Tip1 db 'Please input number_x:$'
Tip2 db 'Please input number_y:$'
Tip3 db 'Error,please retype!$'
Tip4 db 'Please select function:1-->sub,2->multiplication,3->division,4->mold:$'
Tip5 db 'Result:$'
branch dw fs1
       dw fs2
       dw fs3
       dw fs4
data ends
stack segment

stack ends
code segment
 assume ds:data,cs:code,ss:stack
main proc far
  mov ax,data
  mov ds,ax

  call crlf
  mov ah,9
  lea dx,Tip1
  int 21h
   call crlf
   CALL deci
   mov [x],bx
  
  call crlf
   mov ah,9
   lea dx,Tip4
   int 21h
   call crlf
   mov ah,1
   int 21h
   mov ah,0
   mov [Fun],ax
   call crlf 

   call crlf
   mov ah,9
   lea dx,Tip2
   int 21h
   call crlf
   CALL deci
   mov [y],bx
   call crlf
   
   mov ax,[Fun]
   mov bl,al
   sub bl,31h
   shl bl,1
   mov bh,0
   jmp branch[bx]
fs1: call suber
      jmp out1
fs2: call multiplication
     jmp out1
fs3: call division
     jmp out1
fs4:call mold
    call output

 out1: 
   call output 
   mov ah,4ch
   int 21h
ret
main endp;


deci proc near;十进制输入
    mov bx,0
input3:    
    mov ah,1
    int 21h
    cmp al,0dh
    je exit3;若是换行键表明输入完成
    sub al,30h
    jl cc;若不是数则报错并退出子程序
     cmp al,9
    jg cc;若不是数则报错并退出子程序
    cbw
    xchg ax,bx
    mov cx,10
    mul cx
    xchg ax,bx
    add bx,ax
    jmp input3
cc:call crlf
  mov ah,9
  lea dx,Tip3
   int 21h
    call crlf
   mov bx,0
   jmp input3
exit3:ret
deci endp;


output proc near;十进制输出
      mov ah,09
      lea dx,Tip5
      int 21h
      mov ax,bx
      mov bl,10
      mov si,0
www:   div bl
      mov cl,ah
      add cl,30h
      mov ch,0
      push cx
      mov ah,0
      inc si
      cmp al,0
      ja www

      jmp print
print:
     mov cx,si
  t: pop dx
     mov ah,2
     int 21h
     loop t
ret
output endp;

suber proc near
    mov bx,[x]
    mov ax,[y]
    sub bx,ax
ret
suber endp

multiplication proc near
   mov bx,[x]
     mov ax,[y]
     mov ah,0
     mov bh,0
     mul bl
     mov bx,ax
ret
multiplication endp

division proc near
     mov bx,[y]
     mov ax,[x]
     div bl
     mov bl,al
     mov bh,0
ret
division endp

mold proc near
   mov bx,[y]
    mov ax,[x]
    div bl
    mov bl,ah
    mov bh,0
ret
mold endp

crlf proc near
  mov dl,0ah
  mov ah,02
  int 21h
ret 
crlf endp
code ends
 end main

3.运行结果截图

纠错能力测试(输入错误时会报错并提醒重新输入)

 减法测试:

 乘法测试:

 除法测试:

取余测试:

 

 4.不足之处

1)乘法运算的时候如果结果太大导致溢出,打印结果不正确。

2)除法运算的时候若不是整除结果可能不正确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值