汇编语言习题:键盘输入2个两位十进制数(可以是负数),并输入加、减、乘、除四个运算符中的某一个,完成对应运算,并输出相应的结果。若输入的第二个数为0,就退出计算。

题目:键盘输入2个两位十进制数(可以是负数),并输入加、减、乘、除四个运算符中的某一个,完成对应运算,并输出相应的结果。若输入的第二个数为0,就退出计算。

详细讲解

前置内容:
汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。
汇编语言(Assembly Language)习题:键盘输入任意一个字母,显示其前导字母、字母自身、后续字符共三个字母。
汇编语言习题:编写程序,将一个包含有20个有符号数据的数组ARRAYM分成两个数组:正数数组ARRAYP和负数数组ARRAYN。设数据均为8位。试分别统计负数个数,并计算正数之和。
本文章仅进行了正数的操作,没有设计2个两位十进制数是负数的操作,望各位学习参考。多多指教。

DATAS SEGMENT

DATAS SEGMENT
    meg1 db 'please input a number',0ah,0dh,'$'       ;字符串输出,不难理解
    meg2 db 0ah,0dh,'please input a number',0ah,0dh,'$'
    meg3 db 'incorrect input$'
    meg4 db  0ah,0dh,'please input a char:$'
    meg5 db 0ah,0dh,'$'
    number1 dw 50,?,50,50 dup(0)      ;分别存两个操作数
    number2 dw 50,?,50,50 dup(0) 
DATAS ENDS

CODES SEGMENT(1)

从键盘接收十进制数并存入 BX

                 ……
         mov   bx, 0
newchar: mov   ah, 1
      int   21h
      sub   al, 30h         
      jl    exit       ; <0退出
      cmp   al, 9
      jg    exit       ; >9退出
      cbw

      xchg  ax, bx
      mov   cx, 10
      mul   cx
      xchg  ax, bx
      add   bx, ax

      jmp   newchar
exit:    ……

以存入十进制12为例:
第一次循环:
输入:1

                 ……
         mov   bx, 0
newchar: mov   ah, 1
      int   21h              ;(bx)=0  (ax)='1'
      sub   al, 30h           ;(bx)=0  (ax)=1
      jl    exit       ; <0退出
      cmp   al, 9
      jg    exit       ; >9退出
      cbw

      xchg  ax, bx         ;(bx)=1  (ax)=0
      mov   cx, 10
      mul   cx            ;(bx)=1  (ax)=0
      xchg  ax, bx        ;(bx)=0  (ax)=1
      add   bx, ax        ;(bx)=1  (ax)=1

      jmp   newchar
exit:    ……

第二次循环:
输入:2

                 ……
         mov   bx, 0
newchar: mov   ah, 1
      int   21h              ;(bx)=1  (ax)='2'
      sub   al, 30h           ;(bx)=1  (ax)=2
      jl    exit       ; <0退出    即敲tab键或者空格时退出
      cmp   al, 9
      jg    exit       ; >9退出
      cbw

      xchg  ax, bx         ;(bx)=2  (ax)=1
      mov   cx, 10
      mul   cx            ;(bx)=2  (ax)=10
      xchg  ax, bx        ;(bx)=10  (ax)=2
      add   bx, ax        ;(bx)=12  (ax)=2

      jmp   newchar
exit:    ……

CODES SEGMENT(2)

以减法为例:

substract:mov bx,number1
           call result      ;输出第一个操作数
       
           mov dl,'-'
           mov ah,2
           int 21h
       
           mov bx,number2
           call result       ;输出第二个操作数
       
           mov dl,'='
           mov ah,2
           int 21h 
           mov bx,number1
          mov ax,number2
          sub bx,ax           ;运算结果保存到bx,并输出
          
          call result
         
  mov dx,offset meg4    ;换行回车
        mov ah,9
        int 21h

完整代码

DATAS SEGMENT
    meg1 db 'please input a number',0ah,0dh,'$' 
    meg2 db 0ah,0dh,'please input a number',0ah,0dh,'$'
    meg3 db 'incorrect input$'
    meg4 db 0ah,0dh,'$'
    number1 dw 50,?,50,50 dup(0)    ;分别存两个操作数
    number2 dw 50,?,50,50 dup(0) 
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
   mov dx,offset meg1    ;提示输入number1
   mov ah,9
   int 21h
  
    mov   bx, 0
newchar1: mov   ah, 1
      int   21h
      sub   al, 30h         
      jl    exit       ; <0退出
      cmp   al, 9
      jg    exit       ; >9退出
      cbw

      xchg  ax, bx
      mov   cx, 10
      mul   cx
      xchg  ax, bx
      add   bx, ax

      jmp   newchar1
exit: mov number1,bx

   mov dx,offset meg2    ;提示输入number2
   mov ah,9
   int 21h

      mov   bx, 0
newchar2: mov   ah, 1
      int   21h
      sub   al, 30h         
      jl    exit1       ; <0退出
      cmp   al, 9
      jg    exit1       ; >9退出
     
      cbw

      xchg  ax, bx
      mov   cx, 10
      mul   cx
      xchg  ax, bx
      add   bx, ax

      jmp   newchar2
exit1: mov number2,bx
       
       cmp number2,0
       jz wrong
       
        mov dx,offset meg4    ;换行回车
        mov ah,9
        int 21h

substract:mov bx,number1
           call result
       
           mov dl,'-'
           mov ah,2
           int 21h
       
           mov bx,number2
           call result 
       
           mov dl,'='
           mov ah,2
           int 21h 
           mov bx,number1
          mov ax,number2
          sub bx,ax
          
          call result
         
  mov dx,offset meg4    ;换行回车
        mov ah,9
        int 21h
       
 
plus:  mov bx,number1
       call result
       
       mov dl,'+'
       mov ah,2
       int 21h
       
       mov bx,number2
       call result 
       
       mov dl,'='
       mov ah,2
       int 21h
       
       mov ax,number1
       mov bx,number2
        
       add bx,ax
       call result
       
 mov dx,offset meg4    ;换行回车
        mov ah,9
        int 21h
       
multiply:mov bx,number1
          call result
       
          mov dl,'*'
          mov ah,2
          int 21h
       
          mov bx,number2
          call result 
       
          mov dl,'='
          mov ah,2
          int 21h 
           mov ax,number1
          mov bx,number2
          mul bx
          mov bx,ax
          call result
          
 mov dx,offset meg4   ;换行回车
        mov ah,9
        int 21h
       


division: mov bx,number1
          call result
       
          mov dl,'/'
          mov ah,2
          int 21h
       
          mov bx,number2
          call result 
       
          mov dl,'='
          mov ah,2
          int 21h
          mov ax,number1
          mov bx,number2
          mov dx,0
          div bx
          mov bx,ax
          call result
          jmp end_    


result proc near      ;将bx中的内容按十进制输出
      mov cx,10000d
      call div_
      mov cx,1000d
      call div_
      mov cx,100d
      call div_
      mov cx,10d
      call div_
      mov cx,1d
      call div_

       ret
result endp
div_ proc near
         mov  ax, bx
         mov  dx, 0
         div    cx
         mov  bx, dx
         mov  dl, al
         add   dl, 30h
         mov  ah, 2
         int    21h
   
         ret
div_   endp 
   

wrong: mov dx,offset meg3    ;提示输入wrong  直接到end_
       mov ah,9
       int 21h  
   
end_:   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

运行结果

在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值