📄 xiazai.txt
字号:
.2.2 十六进制数的ASCII码与二进制数之间的转换
转换步骤:
将十六进制数的ASCII码转换为二进制数,要分两种情况:
1.数字:0--9 的ASCII码,这时只需将把它减去30H,即取其的低四位。
2.字母:A--F 的ASCII码,此时可先从ASCII中减去7,然后再去掉高四位即可(即减去30H)。可用如下指令(设ASCII码在AL中):
SUB AL,30H
或:AND AL,0FH
由此可见,首先应该判断被转换的数属于数字段,还是字母段,然后再作相应的处理。
转换举例:
将十六进制数3A8DH转换成十六位二进制数。3A8DH的ASCII码为:0011 0011、 0100 0001、 0011 1000、0100 0100。
将数字的ASCII码 0011 0011和 0011 1000减去30H得0000 0011 和 0000 1000;再将字母的ASCII码 0100 0001和 0100 0100先减去7,得 0011 1010 和0011 1101,再将其减去30H,最后再按其在数中的位置拼成十六位二进制数为:0011 1010 1000 1101。
例:试编出将用ASCII码表示的四位十六进制数3A5DH,转换成十六位二进制数。
分析:将第一个十六进制数的ASCII码与 0FH 相与取其低四位,并将它存放到AX中,然后将AX左移四位,再将第二个数的低四位与AX相加。如此反复,直到完成。
源程序:
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 十进制数的BCD码与ASCII码之间的转换
转换步骤:
将十进制数的BCD码转换为ASCII 码,分为两种情况:
1.对于未组合的BCD码,只要加上 30H即可。可用如下指令(设BCD码放在AL中): ADD AL,30H 或 OR AL,30H
2.对于组合的BCD码,取其低四位 加上30H,存放在低字节,将原数右移 四位,加上30H存放在高字节。
例如:将以BCD码表示的十制数56(0101 0110)转换成ASCII码,过程如下:
先取其低四位 0000 0110,加上30H,存入低字节,再将 0101 0110右移四位得0000 0101 ,加上30H,存入高字节。
例:在CRT显示器上连续 显示00--59的程序。
分析:根据本题要求只要连续产生00--59的BCD码, 然后再将其转换成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 二进制数转换为十进制数的ASCII码
转换步骤:
十六位无符号二进制数可表示为十进制数 0-65535。由此可见,它的最大权值为10000,依次是1000、100、10、1。从而可得到具体的转换方法:从被转换的二进制数中逐次减去各位权值,并记录各位权值所减次数,这样就得到相应位的十进制数字了。如:能够从一个二进制数中减去5次10000, 那么转换后的十进制数的万位数就是5;同 理,从余下的二进制数中再减去1000的 次数,便是十进制数的千位数;依次类推,即可求得各位系数了。
转换举例:
将一个二进制数 0110 1010 0111 1101转换为十进制数,操作如下: 将其减去10000(即减去0010 0111 0001 0000B),在减第三次时不够减,所以,万位为2;再用余数减去1000(11 1110 1000B), 够减7次。如此循环,最后得十进制数 为27261。
例:试编出将二进制数转换成用ASCII码表示的十进制数的程序。
分析:
可利用上述方法进行转换,然后再将各位十进制数字加上30H,即可得到 用ASCII码表 示的十进制数。
6.2.5 十六位二进制数转换为BCD码表示的十进制数
转换步骤(二进制数转换为十进制数方法二):
1.先把十六位二进制数转换为五位十进制数,进行如下操作:用除法指令,对二进制数除以10,余数就是十进制数的个位。然后把商作为被除数,再除以10,余数为十进制数的十位。如此反复,直到余数为零。用这种方法首先得到的是十进制数的个位(低字节),最后得到的是万位(高字节)。
2.然后再把它们组成组合的BCD码。 转换举例:
例如:将二进制数 0110 1010 1101 0011 转换成为十进制数,可先将二进制数放到AX中,DX清0, BL中放除数10,用指令 DIV BL 后,个位数放在DX中(也就是AX除以10的余数),然后将DX清0,再用 DIV BL指令,得到的余数就是十进制数的十位。如此反复,直到余数为0。
然后再把它们的高位在前,低位在后组成组合的BCD码。
6.2.6 ASCII码表示的十进制数转换成二进制数
转换步骤:
将用ASCII码表示的十进制数转换成为二进制数的过程如下:
首先将它转换成BCD码,然后再转换成二进制数。而将BCD码表示的十进制数转换成二进制数的方法可用下式说明:
458=((0*10+4)*10+5)*10+8
由此可知,先将累加和赋初值为0,然后每次将累加和乘10再加下一位数字,逐位完成,直到个位。由于计算机中的BCD码和10均是以二进制表示的,所以其结果必定为二进制数。
例:编制一子程序,将存在某一存区中用ASCII码表示的十进制数转换成为二进制数,其调用方式如下:
SI〈--被转换数存区首址
CX〈--被转换数位数
CALL ADECXB
返回 (二进制数在AX中)
源程序:
ADECXB PROC NEAR ;十进制数转换成二进制数 ; 子程序
PUSH BX ;保护现场
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位十进制数ASCII码
AND BL,0FH ;取BCD码
ADD AX,BX
INC SI ;修改地址指针
LOOP AGAIN
POP SI ;恢复现场
POP DX
POP CX
POP BX
RET
ADECXB ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -