请教DA 的用法 |
来源:21ic 作者:wxq22 栏目:新手园地 |
请教DA 的用法 哪位大哥能给我讲解以下DA这个十进制调整指令的用法? 都加6是什么意思? |
1楼: | >>参与讨论 |
作者: maychang 于 2006-7-5 10:07:00 发布: Re: 十进制调整用于BCD码加法。两个压缩BCD数相加,先按照二进制相加,然后用十进制调整指令,该指令检查结果是否正确,如错误则进行调整。 例如,55H与66H相加,按照二进制是BBH,没有进位。但按照十进制则应该是21H,有进位。 MOV A,#55H ADD A,#66H 结果是BBH,C清零 MOV A,#55H ADD A,#66H DA A 结果是21H,C置位 |
2楼: | >>参与讨论 |
作者: wxq22 于 2006-7-5 17:07:00 发布: 还是有点问题 1-前面为什么要清0 2-后面21H是怎么来的,能否再说明一下. 因为我看的书上把这个DA的用法省略掉了,请指教.THANK YOU VERY MUCH! |
3楼: | >>参与讨论 |
作者: wxq22 于 2006-7-5 17:10:00 发布: BCD码的范围? BCD码的范围是0-F吗? |
4楼: | >>参与讨论 |
作者: twz8858877 于 2006-7-5 18:33:00 发布: DA指令 一般用于加法以后做十进制调整,具体操作是累加器低四位大于9或辅助进位为1时,低四位加6;高四位大于9或进位位为1时高四位加6。在maychang举的例子中加法以后累加器中高四位与低四位均大于9,所以调整时高低四位同时加6,结果为21H,C置位。 BCD码范围为0~9,称为二-十进制数,即用二进制来表示的十进制数,DA指令中的加6正是这两种数制范围不同而得来的。(单片机中的运算指令都是基于二进制的) |
如果随意对一个累加器A中的二进制数据进行“二进制转十进制”调整是没有任何实际意义的!
DA调整的对象是ADD或ADDC以后的结果,而且是BCD码相加以后才能够加以调整,否则没有实际意义!
比如,现在我想执行12D+39D也就是两个十进制数相加这样一个加法(有时候程序处理的需要,数据在单片机中是以BCD码的形式存储的,也就是12H和39H(十六进制),但我们可以人为将它们看为12D和39D(十进制),而且还希望相加以后的结果为51H,也就是说符合十进制运算规则12+39=51,而不是4BH的结果),但这样的十进制加法运算在单片机中是不能够直接实现的。因为单片机只能够执行二进制加法指令,也就是所有的运算都按照二进制中的规则进行!
于是就出现了DA调整指令!
现在12H+39H,将12H放于A中,执行 ADD A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA A 指令后,就会将A中的数据调整为51H(具体调整过程和原理你可以详细看书,如果单片机书中讲的不详细,那么微机原理中一定说的非常详细),而我们按照BCD码规则就将其看为51D,符合我们的要求!
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!所以楼主所说的当A=# 9AH的时候的情况是不会存在的,严格的说是没有意义的!
而且DA A指令只用于十进制BCD码加法指令以后,否则是没有实际意义的!
用户1335339 2009-12-1 12:22
huli184_389376486 2008-7-4 10:54
用户1099353 2008-5-29 19:23
用户479881 2008-5-21 17:22
用户479881 2008-5-21 17:21
用户142361 2008-4-22 11:14
用户34281 2008-1-20 19:34