新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 匯編中 ADD 和ADDC 的理解

        匯編中 ADD 和ADDC 的理解

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

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

        本文引用地址:http://www.104case.com/article/201611/323080.htm
         
        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碼運算時使用……



        關鍵詞: 匯編ADDADD

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 班玛县| 库伦旗| 柯坪县| 海兴县| 通道| 龙陵县| 门源| 天台县| 建宁县| 望城县| 苍梧县| 鄄城县| 汶上县| 嘉兴市| 宜兴市| 如东县| 盱眙县| 彭水| 霸州市| 阿克苏市| 泾源县| 丹寨县| 南陵县| 麦盖提县| 柳州市| 寻乌县| 喀喇沁旗| 天镇县| 怀集县| 循化| 定南县| 永登县| 嘉兴市| 营山县| 和平区| 高平市| 土默特左旗| 清镇市| 民丰县| 镇巴县| 阿合奇县|