<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          匯編中 ADD 和ADDC 的理解

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

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

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

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

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

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

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



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();