(1)按當前流行的以 IBM PC 為主機的開發系統對匯編語言的規定,讀者不必再進行修改,便可直接使用。
(2)對浮點運算子程序庫進行了進一步的測試和優化,對十進制浮點數和二進制浮點數的相互轉換子程序進行了徹底改寫,提高了運算精度和可靠性。
(3)新增添了若干個浮點子程序(傳送、比較、清零、判零等),使編寫數據處理程序的工作變得更簡單直觀。
入口條件:待轉換的單字節十六進制數在累加器A中。
出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
影響資源:PSW、A、B 堆棧需求: 4字節
HASC: MOV B,A ;暫存待轉換的單字節十六進制數
LCALL HAS1 ;轉換低四位
XCH A,B ;存放低四位的ASCII碼
SWAP A ;準備轉換高四位
HAS1: ANL A,#0FH ;將累加器的低四位轉換成ASCII碼
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
(15) 標號: ASCH 功能:ASCII碼轉換成十六進制數
入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。
出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。
影響資源:PSW、A 堆棧需求: 2字節
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
(16) 標號:HBCD 功能:單字節十六進制整數轉換成單字節BCD碼整數
入口條件:待轉換的單字節十六進制整數在累加器A中。
出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。
影響資源:PSW、A、B、R3 堆棧需求: 2字節
HBCD: MOV B,#100 ;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數繼續分離十位和個位
XCH A,B
DIV AB
SWAP A
ORL A,B ;將十位和個位拼裝成BCD碼
RET
(17) 標號: HB2 功能:雙字節十六進制整數轉換成雙字節BCD碼整數
入口條件:待轉換的雙字節十六進制整數在R6、R7中。
出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。
影響資源:PSW、A、R2~R7 堆棧需求: 2字節
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit
RET
(18) 標號: HBD 功能:單字節十六進制小數轉換成單字節BCD碼小數
入口條件:待轉換的單字節十六進制小數在累加器A中。
出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。
影響資源:PSW、A、B 堆棧需求: 2字節
HBD: MOV B,#100 ;原小數擴大一百倍
MUL AB
RLC A ;余數部分四舍五入
CLR A
ADDC A,B
MOV B,#10 ;分離出十分位和百分位
DIV AB
SWAP A
ADD A,B ;拼裝成單字節BCD碼小數
DA A ;調整后若有進位,原小數接近整數1
RET
(19) 標號: HBD2 功能:雙字節十六進制小數轉換成雙字節BCD碼小數
入口條件:待轉換的雙字節十六進制小數在R2、R3中。
出口信息:轉換后的雙字節BCD碼小數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節
HBD2: MOV R4,#4 ;四位十進制碼
HBD3: MOV A,R3 ;原小數擴大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC ;保存溢出的一位十進制碼
DJNZ R4,HBD3 ;計算完四位十進制碼
POP ACC ;取出萬分位
MOV R3,A
POP ACC ;取出千分位
SWAP A
ORL A,R3 ;拼裝成低字節BCD碼小數
MOV R3,A
POP ACC ;取出百分位
MOV R2,A
POP ACC ;取出十分位
SWAP A
ORL A,R2 ;拼裝成高字節BCD碼小數
MOV R2,A
RET
(20)標號:BCDH 功能:單字節BCD碼整數轉換成單字節十六進制整數
入口條件:待轉換的單字節BCD碼整數在累加器A中。
出口信息:轉換后的單字節十六進制整數仍在累加器A中。
影響資源:PSW、A、B、R4 堆棧需求: 2字節
BCDH: MOV B,#10H ;分離十位和個位
DIV AB
MOV R4,B ;暫存個位
MOV B,#10 ;將十位轉換成十六進制
MUL AB
ADD A,R4 ;按十六進制加上個位
RET
(21)標號: BH2 功能:雙字節BCD碼整數轉換成雙字節十六進制整數
入口條件:待轉換的雙字節BCD碼整數在R2、R3中。
出口信息:轉換后的雙字節十六進制整數仍在R2、R3中。
影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節
BH2: MOV A,R3 ;將低字節轉換成十六進制
LCALL BCDH
MOV R3,A
MOV A,R2 ;將高字節轉換成十六進制
LCALL BCDH
MOV B,#100 ;擴大一百倍
MUL AB
ADD A,R3 ;和低字節按十六進制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
(22)標號: BHD 功能:單字節BCD碼小數轉換成單字節十六進制小數
入口條件:待轉換的單字節BCD碼數在累加器A中。
出口信息:轉換后的單字節十六進制小數仍在累加器A中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
BHD: MOV R2,#8 ;準備計算一個字節小數
BHD0: ADD A,ACC ;按十進制倍增
DA A
XCH A,R3
RLC A ;將進位標志移入結果中
XCH A,R3
DJNZ R2,BHD0 ;共計算8bit小數
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD1 ;四舍
INC R3 ;五入
BHD1: MOV A,R3 ;取結果
RET
(23)標號: BHD2 功能:雙字節BCD碼小數轉換成雙字節十六進制小數
入口條件:待轉換的雙字節BCD碼小數在R4、R5中。
出口信息:轉換后的雙字節十六進制小數在R2、R3中。*
影響資源:PSW、A、R2~R6 堆棧需求: 2字節
BHD2: MOV R6,#10H ;準備計算兩個字節小數
BHD3: MOV A,R5 ;按十進制倍增
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3 ;將進位標志移入結果中
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,BHD3 ;共計算16bit小數
MOV A,R4
ADD A,#0B0H ;剩余部分達到0.50否?
JNC BHD4 ;四舍
INC R3 ;五入
MOV A,R3
JNZ BHD4
INC R2
BHD4: RET