关于 BCD 码减数求补的问题

有这样一个问题:

汇编程序如下:

      ORG  0100H
      MOV  R1, #50H
      MOV  R0, #60H
      CLR  C
      CALL BSUB
      MOV  40H, A
          .
          .
          .
BSUB: MOV  A, #9AH
      SUBB A, @R0
      ADD  A, @R1
      DA   A
      INC  R0
      INC  R1
      CPL  C
      RET

问:其中 9AH 的作用是什么,能不能换成别的数!

问题补充:BCD 码减法程序。

==========================================================
      
做而论道 回答:     | 五级  2009-8-29 09:58

这是 MCS-51 单片机的汇编语言,很多人都不懂的。

程序实现了 (50H)-(60H)-->(40H) 的 BCD 码减法运算;并且对源数据的地址指针进行了修正。

BCD码的运算之后,应(使用 DA  A指令)进行十进制调整,将运算结果修正为 BCD 码;
只是 MCS-51 单片机的 DA  A 指令只能放在加法之后,它对减法不起作用。

为此,BCD 码的减法必须变换成加法,才能用 DA  A 指令进行十进制调整。

借用手表倒拨15分,和正拨45分,效果相同的方法,可将:
    (50H) - (60H)
等效变换为:
    (50H) + [100 - (60H)]

式中的 100,又等效写成 9AH,不信,你对它 DA  A 试试,马上就是 100H,这就是 100 的 BCD码,你说它能写成别的数吗 ?

==========================================================

后记:

上面的回答,并没有得到提问者的青睐,看来还是没有说明白,下面再解释一下。

关于“减数求补”的问题,是 MCS-51 单片机的汇编语言中,特有的问题。

两个 BCD 码相减,如果想要得到 BCD 码形式的结果,就应该进行十进制调整。

但是 MCS-51 单片机的十进制调整指令 (DA  A) 只能放在加法指令之后,它对减法不起作用。
为此,BCD 码的减法,必须变换成加法进行,才能使用 DA  A 指令进行十进制调整。

减法怎么变换成加法呢?这里就涉及到“补数”的问题。

大家知道,钟表倒拨 15 分和正拨 45 分,效果是相同的。
那么,可通过: 60-15=45   求出 15 对 60 的补数 45。
而 2 位十进制数字的补数,要用如下公式进行计算:

    100 - (减数) = 补数

求出补数后,再把补数和被减数相加,得到的“和”就是原来要求出的“差”了。

注意:此时用的是加法。那么,现在就可以使用 DA  A 指令进行调整了。

上面公式中的 100,可等效写成 9AH,当对它进行 DA  A 调整后,它就会变成 100H。
9AH 和 100H,都是 100 的 BCD 码。

注意:求“补数”和求“补码”的概念、方法都是不同的。不能用补码当补数。


例如,已知十进制减法运算是: 87 - 34 = 53

在单片机里面的计算步骤就是:

                   9AH -34H = 66H

                   87H + 66H = EDH

                   DA  A后得:153H

    把进位 1 丢弃,结果就是 53 的 BCD 码 53H。

原题网址:http://zhidao.baidu.com/question/114254709.html

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值