BCD碼/DA指令


BCD碼(Binary-Coded Decimal‎)亦稱二進碼十進數或二-十進制代碼。用4位二進制數來表示1位十進制數中的0~9這10個數碼。是一種二進制的數字編碼形式,用二進制編碼的十進制代碼

 

BCD碼的運算規則:

BCD碼是十進制數,而運算器對數據做加減運算時,都是按二進制運算規則進行處理的。這樣,當將 BCD碼傳送給運算器進行運算時,其結果需要修正。修正的規則是:當兩個BCD碼相加,如果和等於或小於 1001(即十進制數 9),不需要修正;如果相加之和在 1010 到1111(即十六進制數 0AH~0FH)之間,則需加 6 進行修正;如果相加時,本位產生了進位,也需加 6 進行修正。這樣做的原因是,機器按二進制相加,所以 4 位二進制數相加時,是按“逢十六進一”的原則進行運算的,而實質上是 2 個十進制數相加,應該按“逢十進一”的原則相加,16 與10相差 6,所以當和超過 9或有進位時,都要加 6 進行修正。

eg:

(1) 將 5 和 8 以 8421 BCD輸入機器,則運算如下:

 

  0 1 0 1

 

  +) 1 0 0 0

 

  1 1 0 1 結果大於 9

 

  +) 0 1 1 0 加 6 修正

 

  1 0 0 1 1 即13 的 BCD碼

 

  結果是 0011,即十進制數 3,還產生了進位。5+8=13

 

 

(於2012年5月22日20:06:11

DA為十進制調整指令,功能是在進行BCD碼加法運算時,用來對BCD碼的加法運算結果進行自動修正。但對BCD碼的減法不能用此指令來進行修正。因為BCD碼本質上時十進制,而單片機只懂二進制,因此當兩個BCD數相加大於9時,單片機仍按二進制加法相加,應進位而不產生進位,導致出現非法BCD碼,導致計算結果出錯。在此種情況下必須進行+6修正才能得到正確的BCD碼。但是判斷后+6指令繁瑣,因此出現DA這個指令,可以減少代碼長度。

12D+39D(十進制)
12H和39H(十六進制) 這兩個數是相等的嗎,12H=18D? 39H=57D ?

DA調整的對象是ADD或ADDC以后的結果,而且是BCD碼相加以后才能夠加以調整,否則沒有實際意義!

比如,現在我想執行12D+39D也就是兩個十進制數相加這樣一個加法(有時候程序處理的需要,數據在單片機中是以BCD碼的形式存儲的,也就是12H和39H(十六進制),但我們可以人為將它 們看為12D和39D(十進制),而且還希望相加以后的結果為51H,也就是說符合十進制運算規則12+39=51,而不是4BH的結果),但這樣的十進制加法運算在單片機中是不能夠直接實現的。因 為單片機只能夠執行二進制加法指令,也就是所有的運算都按照二進制中的規則進行!於是就出現了DA調整指令!現在12H+39H,將12H放於A中,執行 ADD A,#39H指令,則結果為4BH,這不是我們希望的51H的數據形式!!這時執行DA A 指令后,就會將A中的數據調整為51H(具體調整過程和原理你可以 詳細看書,如果單片機書中講的不詳細,那么微機原理中一定說的非常詳細),而我們按照BCD碼規則就將其看為51D,符合我們的要求!也就是說加數和被加數都是BCD碼的形式,最大也只可能是99H,也就是我們十進制數中的99,只有這樣才會有實際的意義

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM