書上講到ADDC指令會加上進位標志位CY,可以方便的進行多字節(jié)數(shù)連加運算。我想想,比如兩個數(shù)用ADDC相加有溢出,CY置1了,最后豈不是比正確的結(jié)果多了1?百思不得其解……終于在百度上看到一個很好的回答(復制自百度知道):
本文引用地址:http://www.ex-cimer.com/article/201611/323080.htm
ADD 兩數(shù)相加,不加進位位。 ADDC 兩數(shù)相加,同時再加個進位位。進位當時為1就加1 為0就加0相當于不加 一般用在多字節(jié)數(shù)相加中。最低位相加,用ADD ,加完后,可能產(chǎn)生進位,高字節(jié)相加就用ADDC 這樣,低字節(jié)相加產(chǎn)生的進位就會被加進來。 比如 0080H + 0180H 低字節(jié)相加用 ADD 80H+80H=100H 用ADD指令得到 00H 并溢出產(chǎn)生進位 C=1 高字節(jié) 相加用 ADDC 00H+01H=01H 用 ADDC 指令兩數(shù)相加結(jié)果 01H會再加上進位位 1 得到 02H 0080H+0180H = 02 00H 再比如 0080H + 0101H 80H+01H = 81H 沒有溢出進位為 C=0 00H+01H =01H 用ADDC指令會 再加進位位 C=0 得到 01H 結(jié)果 0080H+0101H = 0181H
原來ADDC指令用于8位以上的數(shù)相加,而且要把低8位先分解出來,用ADD先進行運算,這時候的CY會影響高于8位的運算,要考慮進去,此時再用ADDC,把CY也考慮進去,算出高位的結(jié)果,再組合起來。原來如此。不過據(jù)自己了解,16位數(shù)據(jù)的操作,只能用DPTR,難倒結(jié)果要存在這里?噢,忘了可拆分保存在Rn里面了……
還有關(guān)于ADD對OV標志位的影響,我也不大明白。書中說的是,和第六,第七位成異或關(guān)系(最低位是0),這兩位同時有、無進位,則OV清0;若這兩位一個有進位,一個沒有,則OV置1。我也想了很久:發(fā)現(xiàn)這個問題,貌似挺復雜的:
首先假定最高位作為符號位,那么能夠表示數(shù)字的剩下7位,也就是2的7次方:正負128。把0也算進去,那么就是-128~+127。這個時候進行加法運算,僅有第七位(符號位)有進位的話,OV置1,代表結(jié)果錯誤,正負被改變。同樣只有第六位進位的話,第七位也會被改變,OV置1,同樣正負改變,結(jié)果也是錯誤的。
但是我有兩個問題:1——最高位代表符號是不是人為確定的?兩個41H相加,得到82H,OV置1是給程序員自己作參考的嗎?告訴你符號改變了?
2——假如第六第七位都進行了進位,那么就會有溢出才對,這時候OV不應(yīng)該置1嗎?難道說OV在ADD的情況下為了不混淆,所以只用作報錯,而不再表示溢出了?異或第七位是符號位,不存在溢出的問題?
最后關(guān)于DA(十進制調(diào)整指令),我也不是很清楚為什么要用這東西,但是BCD碼和二進制已轉(zhuǎn)換確實存在一個問題:常用BCD碼就是0~9用二進制0000~1001表示,這個一般都知道,但是表示有進位的兩位十進制數(shù)時,是組合起來的表示的。例如:十進制10對應(yīng)BCD碼00010000,這時候二進制00010000的十進制值卻是16~!就這樣差6了!所以當微機預算得到00010000時,想告訴你這個值是十進制16,假如不經(jīng)過修正直接轉(zhuǎn)為BCD碼的話,這個值卻成了10~!不過習慣了二進制直接得出十進制數(shù),這個……貌似用不著,所以還是不清楚什么具體情況叫做:在進行BCD碼運算時使用……
評論