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

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


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

执行DAA指令后,又是怎么调整的?
...全文
232 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzhfu 2010-11-21
  • 打赏
  • 举报
回复
它比加法调整简单些,因为不借位就不会产生超过9的数字。但借位后它是当16用的,而做为BCD码我们希望它仅当10用,所以要退回多用的6.

Step 1:调整个位数。

若个位数产生借位了(辅助进位标志AF=1),则个位减去多用的6(比如43H-29H=1AH,此时AF=1所以才产生了个位的A,让它减去6剩下4)。

若个位数没借位(AF=0),个位就不用调整成了。

Step 2:调整十位数。


若十位数产生借位了(辅助进位标志CF=1),则十位减去多用的6。

若十位数没借位(CF=0),个位就不用调整成了。


43H-29H时,没产生CF,所以十位数不动,因此最后结果十位是1,个位是4,得到14H.
kartik 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shzhfu 的回复:]
刚才回贴时我没计算,把你的结果抄过来,就直接写成6B了。写调整过程时,发现了6B的错误,但忘记了前面还有,就没改前面的。
[/Quote]

应该是书上出错了。

那43H-29H 的非压缩BCD码呢
shzhfu 2010-11-21
  • 打赏
  • 举报
回复
刚才回贴时我没计算,把你的结果抄过来,就直接写成6B了。写调整过程时,发现了6B的错误,但忘记了前面还有,就没改前面的。
shzhfu 2010-11-21
  • 打赏
  • 举报
回复
如果你这个例子是从书上抄下来的,那就是书上写错了。
kartik 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shzhfu 的回复:]
ADD做普通加法,它不把43H和29H看成BCD码,所以得到的和是6BH。转换成十进制表示72,但计算机内只能保存二进制形式,写成对应的十六进制就是6BH.

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

DAA调整分两步进行:

Step 1:调整个位数。

若个位数产生进位了(辅助进位标志AF=1),即低4位向高4位进位了,那它是逢十六才进一。当BCD……
[/Quote]
我也觉得应该是6C啊,会不会出错了?
shzhfu 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中。

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧