彙編學習筆記07——BCD碼及調整指令

我想當個程式設計師發表於2020-10-29

一、BCD碼

什麼是BCD碼呢?

BCD碼的全稱是Binary Coded Decimal。可以看出是關於二進位制和十進位制的編碼。
我們在寫十進位制轉二進位制的時候,採用的是8421編碼制,比如十進位制的43,在二進位制就是 0010 1011
而BCD碼會將這個十進位制的數分割成4和3,分別用兩個4位二進位制去表示:
0100 0011——0100是4 0011是3.

BCD碼其實有兩種格式壓縮BCD碼和非壓縮BCD碼
上面寫的那種就是壓縮BCD碼,一個位元組的高低四位各表示一個十進位制數。

而非壓縮BCD碼則是,一個位元組只有低四位去表示一個十進位制數,高四位空閒不用。
比如剛才的43,用非壓縮BCD碼錶示就是xxxx0100 xxxx0011

BCD碼其實用的不多,但是考試可能會涉及到,所以我們著重學一下BCD碼的調整指令

二、BCD調整指令

什麼是BCD調整指令呢?或者說為什麼要調整呢?

我們剛才說BCD碼用得不多,所以任何CPU都沒有設定專門的BCD碼的運算指令,只能通過正常普通的二進位制運算指令來進行。

這就出問題了。

比如我們想算一個十進位制的35+35,我們希望得到的是一個為70D的BCD碼(0111 0000)
但是我們算一下,35的BCD碼是0011 0101,按照二進位制的運算方式,35+35就成了0110 1010。
仔細看,後面兩個5+5,本應該滿十進一的,結果低四位的二進位制是可以表示10的,就沒有對高四位進位,這樣就與我們期望的結果不匹配了。

再舉個例子,比如38加38,我們期望得到76(0111 0110)
但是0011 1000算完後是0111 0000(70D),這裡是低位產生了進位,但並不是滿十進位,而是帶走了一個16,所以依然比我們期望的低了6。

這樣我們就找到調整的方法了——就是加6

BCD調整指令主要有四種(乘法和除法的不做要求):
DAA壓縮型BCD數加法調整指令
AAA非圧縮型BCD數加法調整指令

DAS壓縮型BCD數減法調整指令
AAS非圧縮型BCD數減法調整指令

1、DAA
DAA是對在AL中的和進行調整,重新產生一個BCD碼,放在加法指令後面
格式:DAA
運算元隱含為AL暫存器

方法為:

  • 如果AL中的低四位在A~F之間(即低四位大於10D),或者AF為1(即低四位產生進位),則AL <- AL+6,且將AF置為1.
  • 如果AL中的高四位在A~F之間(即高四位大於10D),或者CF為1(即高四位產生進位),則AL <- AL+60H,且將CF置為1.

2、DAS
DAS是對在AL中的差進行調整,重新產生一個BCD碼,放在減法指令後面
格式:DAS
運算元隱含為AL暫存器

方法為:

  • 如果AL中的低四位在A~F之間(即低四位大於10D),或者AF為1(即低四位產生進位),則AL <- AL-6,且將AF置為1.
  • 如果AL中的高四位在A~F之間(即高四位大於10D),或者CF為1(即高四位產生進位),則AL <- AL-60H,且將CF置為1.

注:DAA和DAS要緊跟在加法減法指令之後

相關文章