?? xiazai.txt
字號:
.2.2 十六進(jìn)制數(shù)的ASCII碼與二進(jìn)制數(shù)之間的轉(zhuǎn)換
轉(zhuǎn)換步驟:
將十六進(jìn)制數(shù)的ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù),要分兩種情況:
1.數(shù)字:0--9 的ASCII碼,這時只需將把它減去30H,即取其的低四位。
2.字母:A--F 的ASCII碼,此時可先從ASCII中減去7,然后再去掉高四位即可(即減去30H)??捎萌缦轮噶?設(shè)ASCII碼在AL中):
SUB AL,30H
或:AND AL,0FH
由此可見,首先應(yīng)該判斷被轉(zhuǎn)換的數(shù)屬于數(shù)字段,還是字母段,然后再作相應(yīng)的處理。
轉(zhuǎn)換舉例:
將十六進(jìn)制數(shù)3A8DH轉(zhuǎn)換成十六位二進(jìn)制數(shù)。3A8DH的ASCII碼為:0011 0011、 0100 0001、 0011 1000、0100 0100。
將數(shù)字的ASCII碼 0011 0011和 0011 1000減去30H得0000 0011 和 0000 1000;再將字母的ASCII碼 0100 0001和 0100 0100先減去7,得 0011 1010 和0011 1101,再將其減去30H,最后再按其在數(shù)中的位置拼成十六位二進(jìn)制數(shù)為:0011 1010 1000 1101。
例:試編出將用ASCII碼表示的四位十六進(jìn)制數(shù)3A5DH,轉(zhuǎn)換成十六位二進(jìn)制數(shù)。
分析:將第一個十六進(jìn)制數(shù)的ASCII碼與 0FH 相與取其低四位,并將它存放到AX中,然后將AX左移四位,再將第二個數(shù)的低四位與AX相加。如此反復(fù),直到完成。
源程序:
DATA SEGMENT
HEX DB '3','A','5','D'
BIN DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
HEXBIN: MOV AX,DATA
MOV DS,AX
LEA SI,HEX
MOV AX,0
MOV CH,4
CONV: MOV BL,[SI]
CMP BL,'9'
JBE BIN1
SUB BL,07H
CLC
BIN1: AND BL,0FH
MOV CL,4
SAL AX,CL
OR AL,BL
INC SI
DEC CH
JNE CONV
MOV BIN,AX
MOV AH,4CH
INT 21H
CODE ENDS
END HEXBIN
6.2.3 十進(jìn)制數(shù)的BCD碼與ASCII碼之間的轉(zhuǎn)換
轉(zhuǎn)換步驟:
將十進(jìn)制數(shù)的BCD碼轉(zhuǎn)換為ASCII 碼,分為兩種情況:
1.對于未組合的BCD碼,只要加上 30H即可??捎萌缦轮噶睿ㄔO(shè)BCD碼放在AL中): ADD AL,30H 或 OR AL,30H
2.對于組合的BCD碼,取其低四位 加上30H,存放在低字節(jié),將原數(shù)右移 四位,加上30H存放在高字節(jié)。
例如:將以BCD碼表示的十制數(shù)56(0101 0110)轉(zhuǎn)換成ASCII碼,過程如下:
先取其低四位 0000 0110,加上30H,存入低字節(jié),再將 0101 0110右移四位得0000 0101 ,加上30H,存入高字節(jié)。
例:在CRT顯示器上連續(xù) 顯示00--59的程序。
分析:根據(jù)本題要求只要連續(xù)產(chǎn)生00--59的BCD碼, 然后再將其轉(zhuǎn)換成ASCII 碼,輸出顯示即可。
源程序:
DATA SEGMENT
BUFFER DB 20H,3 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
DISPLAY PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV BL,-1
PUSH BX
GO: MOV SI,OFFSET BUFFER+1
POP BX
MOV AL,BL
ADD AL,1
DAA
CMP AL,60H
JC DONE
MOV AL,0
DONE: MOV BL,AL
PUSH BX
MOV DL,AL
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [SI],AL
INC SI
MOV AL,DL
AND AL,0FH
ADD AL,30H
MOV [SI],AL
INC SI
MOV AL,'$'
MOV [SI],AL
MOV Dx,OFFSET BUFFER
MOV AH,09H
INT 21H
MOV CX,0FFFFH
LOP: DEC CX
JNE LOP
MOV AH,0
INT 16H
CMP AL,' '
JNZ GO
POP BX
RET
DISPLAY ENDP
CODE ENDS
END DISPLAY
6.2.4 二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的ASCII碼
轉(zhuǎn)換步驟:
十六位無符號二進(jìn)制數(shù)可表示為十進(jìn)制數(shù) 0-65535。由此可見,它的最大權(quán)值為10000,依次是1000、100、10、1。從而可得到具體的轉(zhuǎn)換方法:從被轉(zhuǎn)換的二進(jìn)制數(shù)中逐次減去各位權(quán)值,并記錄各位權(quán)值所減次數(shù),這樣就得到相應(yīng)位的十進(jìn)制數(shù)字了。如:能夠從一個二進(jìn)制數(shù)中減去5次10000, 那么轉(zhuǎn)換后的十進(jìn)制數(shù)的萬位數(shù)就是5;同 理,從余下的二進(jìn)制數(shù)中再減去1000的 次數(shù),便是十進(jìn)制數(shù)的千位數(shù);依次類推,即可求得各位系數(shù)了。
轉(zhuǎn)換舉例:
將一個二進(jìn)制數(shù) 0110 1010 0111 1101轉(zhuǎn)換為十進(jìn)制數(shù),操作如下: 將其減去10000(即減去0010 0111 0001 0000B),在減第三次時不夠減,所以,萬位為2;再用余數(shù)減去1000(11 1110 1000B), 夠減7次。如此循環(huán),最后得十進(jìn)制數(shù) 為27261。
例:試編出將二進(jìn)制數(shù)轉(zhuǎn)換成用ASCII碼表示的十進(jìn)制數(shù)的程序。
分析:
可利用上述方法進(jìn)行轉(zhuǎn)換,然后再將各位十進(jìn)制數(shù)字加上30H,即可得到 用ASCII碼表 示的十進(jìn)制數(shù)。
6.2.5 十六位二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼表示的十進(jìn)制數(shù)
轉(zhuǎn)換步驟(二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)方法二):
1.先把十六位二進(jìn)制數(shù)轉(zhuǎn)換為五位十進(jìn)制數(shù),進(jìn)行如下操作:用除法指令,對二進(jìn)制數(shù)除以10,余數(shù)就是十進(jìn)制數(shù)的個位。然后把商作為被除數(shù),再除以10,余數(shù)為十進(jìn)制數(shù)的十位。如此反復(fù),直到余數(shù)為零。用這種方法首先得到的是十進(jìn)制數(shù)的個位(低字節(jié)),最后得到的是萬位(高字節(jié))。
2.然后再把它們組成組合的BCD碼。 轉(zhuǎn)換舉例:
例如:將二進(jìn)制數(shù) 0110 1010 1101 0011 轉(zhuǎn)換成為十進(jìn)制數(shù),可先將二進(jìn)制數(shù)放到AX中,DX清0, BL中放除數(shù)10,用指令 DIV BL 后,個位數(shù)放在DX中(也就是AX除以10的余數(shù)),然后將DX清0,再用 DIV BL指令,得到的余數(shù)就是十進(jìn)制數(shù)的十位。如此反復(fù),直到余數(shù)為0。
然后再把它們的高位在前,低位在后組成組合的BCD碼。
6.2.6 ASCII碼表示的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)
轉(zhuǎn)換步驟:
將用ASCII碼表示的十進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的過程如下:
首先將它轉(zhuǎn)換成BCD碼,然后再轉(zhuǎn)換成二進(jìn)制數(shù)。而將BCD碼表示的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)的方法可用下式說明:
458=((0*10+4)*10+5)*10+8
由此可知,先將累加和賦初值為0,然后每次將累加和乘10再加下一位數(shù)字,逐位完成,直到個位。由于計算機中的BCD碼和10均是以二進(jìn)制表示的,所以其結(jié)果必定為二進(jìn)制數(shù)。
例:編制一子程序,將存在某一存區(qū)中用ASCII碼表示的十進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù),其調(diào)用方式如下:
SI〈--被轉(zhuǎn)換數(shù)存區(qū)首址
CX〈--被轉(zhuǎn)換數(shù)位數(shù)
CALL ADECXB
返回 (二進(jìn)制數(shù)在AX中)
源程序:
ADECXB PROC NEAR ;十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù) ; 子程序
PUSH BX ;保護(hù)現(xiàn)場
PUSH CX
PUSH DX
PUSH SI
MOV BH,0
XOR AX,AX ;清累加和寄存器
AGAIN: ADD AX,AX ;AX<--AX*10
MOV DX,AX
ADD AX,AX
ADD AX,AX
ADD AX,DX
MOV BL,[SI] ;取第i位十進(jìn)制數(shù)ASCII碼
AND BL,0FH ;取BCD碼
ADD AX,BX
INC SI ;修改地址指針
LOOP AGAIN
POP SI ;恢復(fù)現(xiàn)場
POP DX
POP CX
POP BX
RET
ADECXB ENDP
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -