回 帖 发 新 帖 刷新版面

主题:请教塞北江南老师

从键盘上输入三个数+/-A,+/-B,+/-C计算(A+B)*C并输出结果(+/-表示正负,A B C 均为小于256的无符号十进制数)  我才开始学汇编希望老师写的简单易懂点.特别是输入部分麻烦详细说明一下.谢谢老师了!
其是我就是不懂如何把入的数如何转成十进制数并相加,我和几个同学都讨论了还是调不出来.

回复列表 (共5个回复)

沙发

现在很忙,等下午有空吧
呵呵

板凳

.model  small
.386
.stack
.data
 tishi1 db 10,13,'please input a:',13,10,'$'
 tishi2 db 10,13,'please input b:',13,10,'$'
 tishi3 db 10,13,'please input c:',13,10,'$'
 temp db 4 dup(?);用于临时存放输入的四个字符
.code
    output macro  tishi ;显示提示信息
      lea dx, tishi
      mov ah,9
      int 21h
    endm
    
    input macro ;输入4个字符
      local first,second,third,forth,inputend
      MOV DWORD PTR TEMP,-1 ;输入前使4个字节都设为无效值
      first:
        mov ah,1
        int 21h
        .if   al=='+' || al=='-'  ;第一个字符必须是+或-号,其他无效,重新输入
            mov temp[0],al
        .else
            jmp first
        .endif
     second:
        mov ah,1
        int 21h
        .if   al>=30h && al<=39h ;第二个字符必须是数字,否则无效,重新输入
            and al,0fh
            mov temp[1],al
        .else
            jmp second
        .endif
     third:
        mov ah,1
        int 21h
        .if   al>=30h && al<=39h ;第三个字符可以是数字,如果不是数字则结束输入
            and al,0fh
            mov temp[2],al
        .else
            jmp inputend
        .endif
     forth:
        mov ah,1
        int 21h
        .if   al>=30h && al<=39h 
            and al,0fh    ;第4个字符可以是数字,如果不是数字则结束输入
            mov temp[3],al
        .else
            jmp inputend
        .endif
      inputend:
    endm
    
    covert macro    ;该宏把输入的字符转换为有符号数,并压入堆栈
      local theend
           mov ax,0
           mov al,temp[1]     ;假设temp的4个字节内容依次为-234,     
          .if temp[2]>=0 && temp[2]<=9 ; 则本处完成2*10+3 存入ax
              mov bl,10    
              mul bl
              add al,temp[2]
              adc ah,0
           .else
              jmp theend
           .endif

          .if temp[3]>=0 && temp[3]<=9 ;假设temp的4个字节内容依次为-234,
              mov bl,10                ; 则本处完成(2*10+3)*10+4 存入ax
              mul bl
              add al,temp[3]
              adc ah,0
          .endif
          
         theend:            ;如果输入的符号位为-号,则取其相反数       
         .if temp[0]== '-'
             neg ax
         .endif
          push ax        ;入栈   
      endm
      
       DISPCHAR MACRO NUMBER  ;该宏显示ax寄存器值除以NUMBER所得的1位10进制商
        POP ax
        .IF AX>=0
          MOV DX,0
          mov bX,NUMBER
          div bX
          PUSH DX     ;余数入栈,为现实下一位准备
          MOV DL,AL
          ADD DL,30H
          MOV AH,2
          INT 21H
        .ELSE
          PUSH AX
        .ENDIF
       ENDM
       
.startup
       output tishi1
       input
       covert       ;把第1次数输入的数转化为16位二进制数并入栈
       output tishi2
       input
       covert         ;把第2次数输入的数转化为16位二进制数并入栈
       output tishi3
       input
       covert        ;把第3次数输入的数转化为16位二进制数并入栈

        mov ah,2   ;换行
        mov dl,10
        int 21h

       pop cx        ;弹出第3个数c
       pop bx        ;弹出第2个数b
       pop ax        ;弹出第1个数a
       add ax,bx     ;a+b
       imul ax,cx    ;(a+b)*c

       or ax,ax
       .if sign?
         mov dl,'-'  ;显示正负符号
         neg ax
       .else
         mov dl,'+'
       .endif
        PUSH AX
        mov  ah,2
        int 21h
        
        DISPCHAR 10000 ;显示万位
        DISPCHAR 1000  ;显示千位
        DISPCHAR 100   ;显示百位
        DISPCHAR 10    ;显示十位
        DISPCHAR 1     ;显示个位

 .exit 0
end

输入:+5
      +10
      -20
显示:-300

输入:-100
      -100
      +100
显示:-20000

3 楼

下班了,注释来不及了,有空再给你加吧!

4 楼

看不懂啊 写哈注释啊 谢谢!!

5 楼

现在加上了

我来回复

您尚未登录,请登录后再回复。点此登录或注册