-270- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
个位的8。其它的十进制数都可以仿照这个方法处理。 上面所讨论的这样一种编码方式一般被称为二-十进制编码(Binary Coded Decimal),简称为BCD编码。PC电脑实际所用的BCD编码规则稍微复杂一些,分为压缩BCD码与非压缩BCD码两种。压缩BCD编码就是上面我们讨论的编码方法,4位二进制数对应1位十进制数。非压缩BCD编码只是将4位二进制数扩展成了8位,但是高4位可以是任意数。以78为例,用压缩BCD码表示是01111000,而用非压缩BCD编码则是????0111????1000,?既可以是1也可以是0,没有任何关系。 这里出现了这样一个奇妙的规律,既然非压缩的BCD码高4位没有意义,那么78不妨可以表示为0011011100111000。细想一下00110111其实是一个字符对应的ASCII码,这个字符是什么呢?查一下ASCII码表即可得知这个字符就是7。同样00111000就是字符8。由来看来我们通过键盘输入的字符0-9所对应的ASCII码其实就是一种非压缩的BCD码。 BCD码与二进制数形式一样,含义不同。给出一个二进制数00111000,它究竟是用压缩BCD码表示的38呢?还是十进制数56呢?为了区别它们,在书写时应注意BCD码的末尾应加上"BCD"后缀。如同十六进制数后加"H",二进制数后加"B"一样。不过这种写法只是为便于我们加以区分,不能用在源程序中。例如在源程序中BCD码00111000仍然要写成00111000B,不能写00111000BCD。这其中的原因很简单,那就是编译程序并不需要区分二进制数与BCD码,00111000BCD最终的编译结果仍然是38H,和00111000B一样。 至于BCD码的运算,8086/88没有使用新的指令,仍然采用ADD、SUB这些二进制运算指令。这些指令只用于二进制数运算,它们不能处理BCD码。举例来说,如果计算56BCD+34BCD的话,使用ADD指令所得到的结果是8AH,而不是应该得到的90BCD。所以BCD码在进行了运算之后要使用一些指令对结果进行必要的调整才行。 压缩BCD码与非压缩BCD码的调整指令不一样,而且不同的运算之后采用的调整指令也不相同。我们举几个压缩的BCD码运算实例,看看调整指令应该遵循的一些规则。 (1)23BCD+36BCD 很明显这两个数相加之后所得的结果59H是不需要进行调整的。 (2)23BCD+37BCD 这两个数相加之后将得结果5AH,而我们需要的结果应该是60H,可见此结果需要调整。调整方法很简单,将5AH的低4位加上一个6就能得出正确的结果。 (3)63BCD+51BCD 这两个数相加应得的结果应该是114H,实际运算结果是0B4H,此结果也要调整。调整方法是将此结果加上60H。0B4H+60H=114H。 由(2)、(3)两例可以得出调整指令遵循的第一个规律:当运算结果的高4位或低4位出现了A-F中的数,则结果需要调整。调整方法是在出现了A-F的4位上加6。 (4)29BCD+57BCD 这两个数相加应得结果是86H,实际运算结果是80H,故此结果需要调整。调整方法与例(2)相同,低4位加6即可。 (5)74BCD+83BCD 这两个数相加应得结果是157H,实际结果是0F7H,需要调整。调整方法与例(3)相同,高4位加6。 通过例(4)、(5)可以看出即使运算结果中没有出现值为A-F的数位,但是如果出现 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |