用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。

求教怎么写?

只显示结果,加数、被加数的显示你自己琢磨吧 !
 
 
        CODE  SEGMENT
              ASSUME    CS:CODE
 
           X  DB        12H,34H,56H
           Y  DB        65H,98H,98H
           N  EQU       $-Y
           Z  DB        N+1 DUP(0)
 
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES          ; 使数据段、附加段与代码在同一段中
              MOV       CX,N        ; 字节数置入cx
              MOV       BX,0        ; 基址寄存器置0
              CLC                   ; 清进位借位标志
         @0:
              MOV       AL,X[BX]    ; 将被加数的低字节移入al
              ADC       AL,Y[BX]    ; 带进未的加,加加数的低字节
              DAA
              MOV       Z[BX],AL    ; 将结果移入和的低字节
              INC       BX          ; 基址寄存器加1
              LOOP      @0          ; 循环
              
              MOV       BYTE PTR Z[BX],0        ; 处理最高位
              JNC       @01
              MOV       BYTE PTR Z[BX], 1
        @01:
              LEA       SI,Z        ; 将和的首地址置入 si
              MOV       CX,N+1      ; 字节数置入 cx
              CLD
         @1:
              LODSB                 ; 装入和的低字节到 al
              CALL      DSPAL       ; 调用子程序以16进制形式显示(其实是显示bcd数)
              LOOP      @1          ; 循环
 
              MOV       AH,4CH
              INT       21H
 
;=============================
       DSPAL  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSHF
              MOV       CX,2        ; 一个字节只有2位的16进制数
              MOV       BX,AX       ; 将al 保存到 bl 中
    @DSPAL1:
              ROR       BL,1        ; 循环将bl 右移4次 ,即将高位移到右侧
              ROR       BL,1
              ROR       BL,1
              ROR       BL,1
              MOV       DL,BL       ; 放到 dl 中
              AND       DL,0FH      ; 清掉 高位
              CMP       DL,9        ; 和9比较
              JA        @DSPAL2     ; 大于 即在 A~F 之间
              ADD       DL,30H      ; 否则就是 0~9,加30H变为 ASCii码
              JMP       @DSPAL3
    @DSPAL2:
              ADD       DL,37H      ; 加 37H 变为 A~F 的ASCii码
    @DSPAL3:
              MOV       AH,2
              INT       21H
              LOOP      @DSPAL1     ; 循环输出 低位
              MOV       AH,2
              MOV       DL,'H'      ; 显示 H
              INT       21H
              MOV       DL,32       ; 显示空格
              INT       21H
              POPF
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       DSPAL  ENDP
 
        CODE  ENDS
              END       START

追问

大哥,你这个程序执行后并不能按照要求啊。。。它直接输出结果77H 32H 55H 01H了。。。

追答

因为程序中给出了x、y,你可以修改x、y

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网