色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編中 ADD 和ADDC 的理解

          匯編中 ADD 和ADDC 的理解

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          書上講到ADDC指令會加上進(jìn)位標(biāo)志位CY,可以方便的進(jìn)行多字節(jié)數(shù)連加運(yùn)算。我想想,比如兩個數(shù)用ADDC相加有溢出,CY置1了,最后豈不是比正確的結(jié)果多了1?百思不得其解……

          終于在百度上看到一個很好的回答(復(fù)制自百度知道):

          本文引用地址:http://cafeforensic.com/article/201611/323080.htm
           
          ADD 兩數(shù)相加,不加進(jìn)位位。 ADDC 兩數(shù)相加,同時再加個進(jìn)位位。進(jìn)位當(dāng)時為1就加1 為0就加0相當(dāng)于不加 一般用在多字節(jié)數(shù)相加中。最低位相加,用ADD ,加完后,可能產(chǎn)生進(jìn)位,高字節(jié)相加就用ADDC 這樣,低字節(jié)相加產(chǎn)生的進(jìn)位就會被加進(jìn)來。 比如 0080H + 0180H 低字節(jié)相加用 ADD 80H+80H=100H 用ADD指令得到 00H 并溢出產(chǎn)生進(jìn)位 C=1 高字節(jié) 相加用 ADDC 00H+01H=01H 用 ADDC 指令兩數(shù)相加結(jié)果 01H會再加上進(jìn)位位 1 得到 02H 0080H+0180H = 02 00H 再比如 0080H + 0101H 80H+01H = 81H 沒有溢出進(jìn)位為 C=0 00H+01H =01H 用ADDC指令會 再加進(jìn)位位 C=0 得到 01H 結(jié)果 0080H+0101H = 0181H
          原來ADDC指令用于8位以上的數(shù)相加,而且要把低8位先分解出來,用ADD先進(jìn)行運(yùn)算,這時候的CY會影響高于8位的運(yùn)算,要考慮進(jìn)去,此時再用ADDC,把CY也考慮進(jìn)去,算出高位的結(jié)果,再組合起來。原來如此。不過據(jù)自己了解,16位數(shù)據(jù)的操作,只能用DPTR,難倒結(jié)果要存在這里?噢,忘了可拆分保存在Rn里面了……
          還有關(guān)于ADD對OV標(biāo)志位的影響,我也不大明白。書中說的是,和第六,第七位成異或關(guān)系(最低位是0),這兩位同時有、無進(jìn)位,則OV清0;若這兩位一個有進(jìn)位,一個沒有,則OV置1。我也想了很久:發(fā)現(xiàn)這個問題,貌似挺復(fù)雜的:

          首先假定最高位作為符號位,那么能夠表示數(shù)字的剩下7位,也就是2的7次方:正負(fù)128。把0也算進(jìn)去,那么就是-128~+127。這個時候進(jìn)行加法運(yùn)算,僅有第七位(符號位)有進(jìn)位的話,OV置1,代表結(jié)果錯誤,正負(fù)被改變。同樣只有第六位進(jìn)位的話,第七位也會被改變,OV置1,同樣正負(fù)改變,結(jié)果也是錯誤的。

          但是我有兩個問題:1——最高位代表符號是不是人為確定的?兩個41H相加,得到82H,OV置1是給程序員自己作參考的嗎?告訴你符號改變了?

          2——假如第六第七位都進(jìn)行了進(jìn)位,那么就會有溢出才對,這時候OV不應(yīng)該置1嗎?難道說OV在ADD的情況下為了不混淆,所以只用作報錯,而不再表示溢出了?異或第七位是符號位,不存在溢出的問題?

          最后關(guān)于DA(十進(jìn)制調(diào)整指令),我也不是很清楚為什么要用這東西,但是BCD碼和二進(jìn)制已轉(zhuǎn)換確實(shí)存在一個問題:常用BCD碼就是0~9用二進(jìn)制0000~1001表示,這個一般都知道,但是表示有進(jìn)位的兩位十進(jìn)制數(shù)時,是組合起來的表示的。例如:十進(jìn)制10對應(yīng)BCD碼00010000,這時候二進(jìn)制00010000的十進(jìn)制值卻是16~!就這樣差6了!所以當(dāng)微機(jī)預(yù)算得到00010000時,想告訴你這個值是十進(jìn)制16,假如不經(jīng)過修正直接轉(zhuǎn)為BCD碼的話,這個值卻成了10~!不過習(xí)慣了二進(jìn)制直接得出十進(jìn)制數(shù),這個……貌似用不著,所以還是不清楚什么具體情況叫做:在進(jìn)行BCD碼運(yùn)算時使用……



          關(guān)鍵詞: 匯編ADDADD

          評論


          技術(shù)專區(qū)

          關(guān)閉