?? hextobcd.asm
字號:
_HEX_BCD:CLR A ;目標數(shù)據(jù)清零初始化
MOV bcdData, A
MOV bcdData+1, A
MOV bcdData+2, A
MOV R2, #15 ; 共進行15次循環(huán)移位運算
H_B0: MOV A, R7 ; 低8位
RLC A ; 大循環(huán)左移
MOV R7, A ; 回存
MOV A, R6 ; 高8位
RLC A ; 大循環(huán)左移
MOV R6, A ; 回存。至此已獲得當前數(shù)據(jù)的最高位
MOV A, bcdData+2 ; 目標數(shù)最低8位
RLC A ; 移入原數(shù)據(jù)的最高位
ACALL _BCD_ADJ ; 壓縮BCD碼的十進制調(diào)整
MOV bcdData+2, A ; 存回
MOV A, bcdData+1 ; 目標數(shù)中間8位
RLC A ; 移入進位位
ACALL _BCD_ADJ ; 壓縮BCD碼的十進制調(diào)整
MOV bcdData+1, A ; 存回
MOV A, bcdData ; 目標數(shù)最高8位
RLC A ; 移入進位位
ACALL _BCD_ADJ ; 壓縮BCD碼的十進制調(diào)整
MOV bcdData, A ; 存回
DJNZ R2, H_B0 ; 繼續(xù)下一輪循環(huán)
; 目標數(shù)據(jù)再左移一位,將原數(shù)據(jù)的最后一位放入,這樣總共進行了16次循環(huán)移位
MOV A, R6
RLC A
MOV A, bcdData+2
RLC A
MOV bcdData+2, A
MOV A, bcdData+1
RLC A
MOV bcdData+1, A
MOV A, bcdData
RLC A
MOV bcdData, A
RET
;*************************************************************************
; 壓縮BCD碼的十進制調(diào)整,基本思路:逢十進一,在這里因為還保留著最后一次左
; 移, 所以進位判別的0AH(0A0H)變成相對右移了一位的05H(050H), 而強迫進行進位
; 的方法是加上一個數(shù)字3(左移一位后就是6)。程序保護PSW
; 輸入返回均使用Acc累加器
;*************************************************************************
RSEG ?PR?_BCD_ADJ?HEX_BCD
_BCD_ADJ:
PUSH PSW
PUSH ACC
CJNE A, #50H, $+3 ; 高4位。做一個比較產(chǎn)生狀態(tài)標志
JC B1 ; 如果小于#50H, 不用進位處理
POP ACC ; 取原數(shù)據(jù)作修改
ADD A, #30H ; 加上#30h,留待下一輪左移時產(chǎn)生進位
PUSH ACC ; 存回原數(shù)據(jù)
B1: ANL A, #0FH ; 僅考慮低4位
CJNE A, #5, $+3 ; 做一個比較產(chǎn)生狀態(tài)標志
JC B2 ; 如果小于#5H, 不用進位處理
POP ACC ; 取原數(shù)據(jù)作修改
ADD A, #3 ; 加上#3h,留待下一輪左移時產(chǎn)生進位
PUSH ACC ; 存回原數(shù)據(jù)
B2: POP ACC ; 恢復(fù)現(xiàn)場
POP PSW
RET
end
/////////////////////////////////////////////////
[nobody]?的快速算法,速度更快。
//////////////////////////////////////////////////////
?PR?_HEX_BCD?HEX_BCD SEGMENT CODE
PUBLIC _HEX_BCD
RSEG ?PR?_HEX_BCD?HEX_BCD
_HEX_BCD:
CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
HB3:
MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R3 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R3
DA A ;十進制調(diào)整
MOV R3,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R5
ADDC A,R5
MOV R5,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
mov a,r3
mov r7,a
mov a,r4
mov r6,a
mov r4,#0
RET
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -