不同进制数及编码相互转换的程序设计方法
来源:用户上传
作者:
摘要:汇编语言中各种数制之间有时需要进行转换,对于二进制、八进制、十进制和十六进制之间的转换相对来说比较常见,但对于ASCII码、BCD码却不常见,本文就针对ASCII码和其它进制数给出了它们相互转换的思路和程序设计。
关键词:ASCII码;二进制;十进制;十六进制
1 引言
计算机输入设备输入的信息一般是由ASCII码表示的数据或字符,而在计算机内部都会转换成二进制数进行计算或其他信息处理,处理结果的输出又必须依照外设的要求变为ASCII码、BCD码等。因此,各类数制的转换和代码的转换是必不可少的,而对于二进制、八进制、十进制和十六进制之间的转换相对来说比较常见,因此,我们着重来探讨一下ASCII码和二进制、十进制等数制的转换。
2 将ASCII码表示的十进制数转换为二进制数
2.1编程思路
十进制数表示为:
Dn×10n+ Dn-1×10n-1+…+ D0×100=∑ Di×10i
Di代表十进制数1,2,…,9,0
上式转换为:
∑Di×10i=((…(Dn×10+Dn-1)×10)+ Dn-2)×10+…+ D1)×10+D0
由此可归纳十进制转换为二进制的方法:从十进制数的最高位Dn开始作乘10加次位的操作,以此类推,则可求出二进制数结果。
2.2参考程序段如下:
假设十进制数为15,其ASCII码为30H,30H,31H,35H,并存于内存2000H开始的单元,转换结果存于3000H开始的单元。
MOV SI,2000H
MOV Di,3000H
MOV BX,10
MOV CX,4
MOV AH,0
MOV AL,[SI]
SUB AL,30H
AA: IMUL BX
ADD AL,[SI+1]
SUB AL,30H
INC SI
LOOP AA
MOV [Di>],AX
3 将二进制数转换为ASCII码表示的十进制数
3.1编程思路
假设是十六位二进制数,其表示范围为0-65535,也就是最大可转换为5位十进制数,5位十进制数可表示为:
ND=D4×104+ D3×103+ D2×102+ D1×10+ D0
Di表示十进制数0 ~9
因此,将十六位二进制数转换为5位ASCII码表示的十进制数,就是求D1 ~D4,并将它们转换为ASCII码。
3.2参考程序段如下:
假设十六位的二进制数存于2000H和2001H单元中,结果存于3000H~3004H单元。
MOV SI,2000H
MOV DX,[SI]
MOV SI,3005H
AA: DEC SI
MOV AX,DX
MOV DX,0
MOV CX,10
DiV CX
XCHG AX,DX
ADD AL,30H
MOV [SI],AL
CMP DX,0
JNE AA
BB: CMP SI,3000H
JZ CC
DEC SI
MOV AL,30H
MOV [SI],AL
JMP BB
CC: HLT
4 十六进制数转换为ASCII码
4.1编程思路
十六进制数为0~FH,在转换为ASCII码时,我们先统一把十六进制数加上30H,对0~9H来说,即可得到其ASCII码,而要得到AH~FH的ASCII码,则需要再加上07H。
4.2参考程序段如下:
假设十六进制数存放在2000H开始的内存单元,转换后的ASCII码存于3000H开始的单元。
MOV CH,4
MOV CL,4
MOV SI,2000H
MOV Di,3000H
MOV DX,[SI]
AA: MOV AX,DX
ADD AL,30H
CMP AL,3AH
JB BB
ADD AL,07H
BB: MOV [Di],AL
INC SI
INC Di
SHR DX,CL
DEC CH
JNZAA
5 结束语
因为我们从键盘上接收的字符都是以ASCII的形式存在,而不论何种进制的数要想显示出来,前提是必须转换成相应的ASCII码。然而在汇编语言中实现数据的显示没有类似高级语言中的输出格式命令那么方便,对每个数的显示,一般都需要逐位地转换成ASCII码才能调用系统显示功能完成显示。所以,我们以上只是介绍了在汇编语言程序设计中,如何在不同数制的数和其ASCII码之间相互转换,如果大家想把一个数以不同的进制从显示器上显示出来的话,只需再加上一段DOS的功能调用即可,这里就不再详细介绍了。
参考文献
[1]沈美明,温冬婵.IBM-PC汇编语言程序设计.北京:清华大学出版社,1991.
[2]西安唐都科教仪器公司 8086试验指导书.
转载注明来源:https://www.xzbu.com/8/view-8737020.htm