您的位置 首页 5G

汇编中 ADD 和ADDC 的了解

书上讲到ADDC指令会加上进位标志位CY,可以方便的进行多字节数连加运算。我想想,比如两个数用ADDC相加有溢出,CY置1了,最后岂不是比正确的

书上讲到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码运算时运用……

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/256754.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部