+ -
当前位置:首页 → 问答吧 → [理解语句]压缩型BCD码的问题

[理解语句]压缩型BCD码的问题

时间:2010-11-21

来源:互联网

MOV AL, 43H
MOV BL, 29H
ADD AL, BL     ;AL=6BH,其不是压缩型的BCD码,因为低四位'B'不是BCD码
DAA         ;调整后,AL=72H,这是压缩型的BCD码,也有:43+29=72


第三行AL=6BH是怎么得到的?

执行DAA指令后,又是怎么调整的?

作者: kartik   发布时间: 2010-11-21

ADD做普通加法,它不把43H和29H看成BCD码,所以得到的和是6BH。转换成十进制表示72,但计算机内只能保存二进制形式,写成对应的十六进制就是6BH.

因为你自己要把两个加数看做BCD码,所以需要做加法调整:DAA.

DAA调整分两步进行:

Step 1:调整个位数。

  若个位数产生进位了(辅助进位标志AF=1),即低4位向高4位进位了,那它是逢十六才进一。当BCD码看时应该逢十进一,所以此时的进位把个位多用了一个6(比如9+9=12H,它是从和18中取出16进到十位数,所以个位只留下2)。这种情况下,要给个位补会一个6.

  若个位数没进位(AF=0),但其值超过了9(是A-F),此时作为十六进制还不需要进位,但作为BCD码,已经需要了,所以调整时,把A-F中的10进到前一位,个位保留它减去10后的余数。(如你例子中BCD码的个位B【应该是C吧】,减掉10,个位余下2,十位加上1,于是就调整成了72H)

  否则(AF=0且低4位不超过9),个位数(即低4位)不动。

Step 2:调整十位数。

  与调整个位数的做法完全相同,只是判断CF是否为1和高4位是否超过9. 需要调整时,产生的进位放在CF中。

作者: shzhfu   发布时间: 2010-11-21

引用 1 楼 shzhfu 的回复:
ADD做普通加法,它不把43H和29H看成BCD码,所以得到的和是6BH。转换成十进制表示72,但计算机内只能保存二进制形式,写成对应的十六进制就是6BH.

因为你自己要把两个加数看做BCD码,所以需要做加法调整:DAA.

DAA调整分两步进行:

Step 1:调整个位数。

若个位数产生进位了(辅助进位标志AF=1),即低4位向高4位进位了,那它是逢十六才进一。当BCD……

我也觉得应该是6C啊,会不会出错了?

作者: kartik   发布时间: 2010-11-21

如果你这个例子是从书上抄下来的,那就是书上写错了。

作者: shzhfu   发布时间: 2010-11-21

刚才回贴时我没计算,把你的结果抄过来,就直接写成6B了。写调整过程时,发现了6B的错误,但忘记了前面还有,就没改前面的。

作者: shzhfu   发布时间: 2010-11-21