微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 汇编中 ADD 和ADDC 的理解

汇编中 ADD 和ADDC 的理解

时间:11-28 来源:互联网 点击:
书上讲到ADDC指令会加上进位标志位CY,可以方便的进行多字节数连加运算。我想想,比如两个数用ADDC相加有溢出,CY置1了,最后岂不是比正确的结果多了1?百思不得其解……

终于在百度上看到一个很好的回答(复制自百度知道):

 
ADD 两数相加,不加进位位。 ADDC 两数相加,同时再加个进位位。进位当时为1就加1 为0就加0相当于不加 一般用在多字节数相加中。最低位相加,用ADD ,加完后,可能产生进位,高字节相加就用ADDC 这样,低字节相加产生的进位就会被加进来。 比如 0080H + 0180H 低字节相加用 ADD 80H+80H=100H 用ADD指令得到 00H 并溢出产生进位 C=1 高字节 相加用 ADDC 00H+01H=01H 用 ADDC 指令两数相加结果 01H会再加上进位位 1 得到 02H 0080H+0180H = 02 00H 再比如 0080H + 0101H 80H+01H = 81H 没有溢出进位为 C=0 00H+01H =01H 用ADDC指令会 再加进位位 C=0 得到 01H 结果 0080H+0101H = 0181H
原来ADDC指令用于8位以上的数相加,而且要把低8位先分解出来,用ADD先进行运算,这时候的CY会影响高于8位的运算,要考虑进去,此时再用ADDC,把CY也考虑进去,算出高位的结果,再组合起来。原来如此。不过据自己了解,16位数据的操作,只能用DPTR,难倒结果要存在这里?噢,忘了可拆分保存在Rn里面了……
还有关于ADD对OV标志位的影响,我也不大明白。书中说的是,和第六,第七位成异或关系(最低位是0),这两位同时有、无进位,则OV清0;若这两位一个有进位,一个没有,则OV置1。我也想了很久:发现这个问题,貌似挺复杂的:

首先假定最高位作为符号位,那么能够表示数字的剩下7位,也就是2的7次方:正负128。把0也算进去,那么就是-128~+127。这个时候进行加法运算,仅有第七位(符号位)有进位的话,OV置1,代表结果错误,正负被改变。同样只有第六位进位的话,第七位也会被改变,OV置1,同样正负改变,结果也是错误的。

但是我有两个问题:1——最高位代表符号是不是人为确定的?两个41H相加,得到82H,OV置1是给程序员自己作参考的吗?告诉你符号改变了?

2——假如第六第七位都进行了进位,那么就会有溢出才对,这时候OV不应该置1吗?难道说OV在ADD的情况下为了不混淆,所以只用作报错,而不再表示溢出了?异或第七位是符号位,不存在溢出的问题?

最后关于DA(十进制调整指令),我也不是很清楚为什么要用这东西,但是BCD码和二进制已转换确实存在一个问题:常用BCD码就是0~9用二进制0000~1001表示,这个一般都知道,但是表示有进位的两位十进制数时,是组合起来的表示的。例如:十进制10对应BCD码00010000,这时候二进制00010000的十进制值却是16~!就这样差6了!所以当微机预算得到00010000时,想告诉你这个值是十进制16,假如不经过修正直接转为BCD码的话,这个值却成了10~!不过习惯了二进制直接得出十进制数,这个……貌似用不着,所以还是不清楚什么具体情况叫做:在进行BCD码运算时使用……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top