有这样一个问题:
汇编程序如下:
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。