計算機內毫無例外地都使用二進制數進行運算,但通常采用8進制和十六進制的形式讀寫。對于計算機技術專業人員,要理解這些數的含義是沒問題,但對非專業人員卻不那么容易的。由于日常生活中,人們最熟悉的數制是十進制,因此專門規定了一種二進制的十進制碼,稱為BCD碼,它是一種以二進制表示的十進制數碼。
二進制編碼的十進制數,簡稱BCD碼(Binarycoded Decimal)。這種方法是用4位二進制碼的組合代表十進制數的0,1,2,3,4,5,6 ,7,8,9 十個數符。4位二進制數碼有16種組合,原則上可任選其中的10種作為代碼,分別代表十進制中的0,1,2,3,4,5,6,7,8,9 這十個數符。最常用的BCD碼稱為8421BCD碼,8.4.2.1 分別是4位二進數的位取值。 右圖為十進制數和8421BCD編碼的對應關系表:
BCD碼和BCD調整指令
BCD碼
BCD碼是一種用4位二進制數字來表示一位十進制數;1、壓縮BCD碼格式(PackedBCDForm;例如:十進制數4256的非壓縮BCD碼表示為4個;BCD碼使用頻率不高,所以任何CPU都不會設置專;但是,運用2進制的運算指令得到的結果就會失去BC;但是按照2進制規律,00110101B+0011
1、壓縮BCD碼格式(Packed BCD Format)。1個字節的高低4位各表示1位十進制數。 例如:十進制數4256的壓縮BCD碼表示為2個字節:0100 0010B、 0101 0110 B 2、非壓縮BCD碼格式(Unpacked BCD Format)。1個字節的高4位空閑不用,僅用低4位表示1位十進制數。
例如:十進制數4256的非壓縮BCD碼表示為4個字節: xxxx0100B、xxxx0010B、 xxxx0101B、 xxxx0110 B 三、BCD碼的運算和調整
BCD碼使用頻率不高,所以任何CPU都不會設置專門的BCD運算指令。遇到BCD碼的運算,只能利用普通2進制運算指令來進行。
但是,運用2進制的運算指令得到的結果就會失去BCD碼的特征。 例1:BCD碼 35 + 35 ,我們希望得到BCD碼70(0111 0000B)。
但是按照2進制規律,0011 0101B + 0011 0101B實際等于0110 1010B。也就是說低4位按照2進制能夠表達10而不會進位。此時,若對結果加6(0110 1010 + 0000 0110),就可以得到正確BCD結果0111 0000B。
例2:BCD碼 38 + 38,我們希望得到BCD碼76(0111 0110B)。
但是按照2進制規律,0011 1000B +0011 1000B實際等于0111 0000B(BCD碼70)。也就是說低4位按照2進制規律產生了進位,而這個進位帶走了16,而不是10,所以結果按照BCD理解少了6。此時,若對結果加6(0111 0000 + 0000 0110),就可以得到正確BCD結果0111 0110B。
可見,利用普通的適用于2進制數的加法指令對BCD進行加法運算,要想得到符合BCD碼的結果,需要自動判斷兩種情況并進行補償處理:當發生了進位需要對結果補償6,當超過9該進位而未進也需要補償6。
51單片機的“DA A”指令就是這個功能,而PSW寄存器中的半進位標志AC就是給DAA指令判別是否發生了進位用的。
AC(Assistant Carry)──輔助進/借位標志,可用命令置位和清零(DA A指令自動判別此位,用戶不使用此位)。
評論
查看更多