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

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

只显示结果,加数被加数的显示你自己琢磨吧 !

 

 

        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

BCD文件是Windows Vista系统文件,类似Windows XP系统的BOOTini,是windows启动引导文件,支持多个系统提取镜像,所以很多系统都支持BCD格式文件。BCD文件支持最初支持PC/AT 在BIOS设置,以后得到扩展到对 firmwares 硬件支持。

BCD

(Binary

Coded

Decimal)

就是二--十进制数。

双字节二进制数就是无符号16位二进制数,数值0到0xffff

二--十进制数:

0

--

0000,

1

--

0001,

2

--

0010,

3

--

0011,

4

--

0100

5

--

0101,

6

--

0110,

7

--

0111,

8

--

1000,

9

--

1001

原数除十取余,就得个位数,个位数等于几,对照上面的0-9,你就有了最低的4位。

原数减掉刚得的余数,再除10,把商除十取余,就得十位数,十位数等于几,对照上面的0-9,你就有了第二个4位了。

按此法,可以得另几个4位。

然后对这些数用“左移”运算和加法,就得到非压缩BCD码。

如用C语言很好解决,不过用C语言不用定义R6R7了, 只要定义一个变量如:unsigned int i;

百位:i/100;

十位:i/10%10;

个位:i%10;

看样子楼主应该是用汇编,如是等到R6达到溢出时才进位的话,比较难做到,实际上你只是要个十百位,也就是说如你R7始终远远没有计满。试一下在R6满100就进位,也就是说R7上存放的数是100的倍数,问题就好解决了:

假如你要把个十百位分别放在R2R3R4中:

MOV A, R6

MOV B, #10

DIV AB

MOV R2, B

MOV R3, A

MOV R4, R7

这样就可以了

以上就是关于用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。全部的内容,包括:用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。、BCD格式文件用什么程序编辑打开、双字节二进制数转成三字节的非压缩BCD码的程序该怎么弄呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9519687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存