(二)数码转换程序及其调试
1、 将ASCII码表示的十进制数转换为二进制数 1)程序设计的算法及其程序 十进制数据可表示为:
DnDnnnDDiiin()DI代表十进制数1,2,3,…9,0 上式可转换为:
Diini(((DnDn))Dn)D)D() 由式(2)可归纳十进制数转换为二进制数的方法:从十进制的最高位Dn开始乘10加
次位的操作,将结果再乘10再加下一次位,如此重复,则可求出二进制数结果来。程序流程及参考程序如图1-1。这里我们规定:被转换的ASCII码十进制数存放在3500H——3504H单位中。而转换结果存放在3510H——3511H单元中。
2)实验步骤
(1)输入程序并检查无误。
(2)在3500H——3504H单元存入十进制数12的ASCII码,即E3500H↙,并输入3030303132H。
(3)G=2000↙,运行程序,并用CTRL+C来中断程序返回监控状态。 (4)用D3510↙来查看结果,应为:3510 0C 00 (5)反复试几组数,考查程序的正确性。
地址(H) 助记符 注释 2000 MOV SI,3500 ;源地址 2003 MOV DI,3510 ;结果地址 2006 MOV BX,000A ;乘数 10 2009 MOV CX,0004 ;计数 200C MOV AH,00 ;AH 清零 200E MOV AL,[SI] ;取被转换数 2010 SUB AL,30 ;ASCII码变十进制数 2012 IMUL BX ;高位(AX)*(BX)送AX 2014 ADD AL,[SI+01] ;取下一位
1017 SUB AL,30 ;ASCII码减30变十进制数 2019 INC SI ;源地址指针+1
201A LOOP 2012 ;CX-1,若CX不等于零则继续 201C MOV [DI],AX ;若CX不等于零则存结果 201E INT 3
2 将十进制数的ASCII码转换为BCD码 1)程序流程和程序
设从键盘输入的五位十进制数的ASCII码已存放在3500H起始的内存单元内,把它转换成BCD码后,再按位分别存入350AH起始的内存单元内。若输入的不是十进制数的ASCII码,则对应存放结果的内容为“FF”。一字节ASCII码取其低四位即变为BCD码,程序流程图及考程序如图1-2所示。 2)实验步骤
(1) 输入程序并检查无误。
(2) 在3500H——3504H单元中存入五位十进制数的ASCII码,即
E3500↙,并输入31,32,33,34,35。 (3) G=2000↙,运行以上程序。 (4) D350A↙,显示结果为:
0000:350A 01 02 03 04 05 CC…
反复试几组数,考查程序的正确性。
地址(H) 助记符 注释
2000 MOV CX,0005;循环计数器赋初值 2003 MOV DI,3500;ASCII码首址 2006 MOV BL,FF; 错误标志送BL 2008 MOV AL,[DI];送ASCII码至AL 200A CMP AL,3A; 比较AL与3AH 200C JNB 2014; 不低于3A则转2014
200E SUB AL,30; 低于3A则取ASCII码的低四位 2010 JB 2014; 低于30则转2014
2012 MOV BL,AL; 否则AL内容送BL,取代FF 2014 MOV AL,BL; 结果或错误标志送AL 2016 MOV [DI+0A],AL 2019 INC DI 201A LOOP 2006 201C INT 3
3 将十六位二进制数转换为ASCII码表示的十进制数 1) 程序及其流程
十六位二进制数的值域为0——65535,最大可转换为五位十进制数。
NDDDDDD算法:五位十进制数可表示为: Di:表示十进制数0——9。
因此,将十六位二进制数转换为五位ASCII码表示表示的十进制数,就是求D1——D4,并将它化为ASCII码。程序流程图如图1-3所示,设源数据存于3500——3501H单元中,结果数存于3510——3514H单元中。 2)实验步骤
(1) 输入程序并检查无误。
(2) 在3500——3501H单元中存放0C00,运行程序并检查结果,应看到3510——3514H
单元中的数依次为3030303132。
(3) 反复试几组数,并运行程序、观察结果。 地址(H) 助记符 注释
2000 MOV DX,[3500];取二进制数 2004 MOV SI,3515; 目标首址在3510 2007 DEC SI 2008 MOV AX,DX 200A MOV DX,0000 200D MOV CX,000A 2010 DIV CX; ; 除10 2012 XCHG AX,DX 2014 ADD AL,30 2016 MOV [SI],AL 2018 CMP DX,0000 201B JNE 2007
201D CMP SI,3510 ; 填余下高位为0 2021 JZ 202A; 2023 DEC SI 2024 MOV AL,30 2026 MOV [SI],AL
2028 JMP 201D 202A INT 3
4、 十六进制数转换为ASCII码 1) 程序及其流程
经过CPU处理后的十六进制数存放在起始地址为3500H的内存单元中,把它们转换成ASCII码之后,再分别存入起始地址为350AH的内存单元中。
从表2-1中可知,十六进制数加30H即可得到0H——9H的ASCII码,而要得到AH——FH的ASCII码,则需再加7H。程序流程图及参考程序如图1-4所示。
2)实验步骤
(1) 输入程序并检查无误。 (2) 在3500——3501H单元中存入四位十六进制数203B,即 E3500↙,并输入3B,20。 (3) G=2000↙,运行以上程序 (4) D350A↙,显示结果为:
0000:350A 42 33 30 32 CC…
输入数据与结果ASCII码对应顺序相反。 (5) 反复试几组数。考查程序的正确性。 地址(H) 助记符 注释 2000 MOV CX,0004 2003 MOV DI,3500 2006 MOV DX,[DI] 2008 MOV AX,DX
200A AND AX,000F ;取低四位值
200D CMP AL,0A; ; 判是否“0”-“9” 200F JB 2013 ; 是“0”-“9”转2013 2011 ADD AL,07; 是“A”-“F”,加7 2013 ADD AL,30; 转换为ASCII码 2015 MOV [DI+0A],AL 2018 INC DI
2019 PUSH CX ;保护循环计数器内容 201A MOV CL,04; 移位次数送CL 201C SHR DX,CL 201E POP CX 201F LOOP 2008 2021 INT 3
5 BCD码转换为二进制数 程序及其流程
设四个二位十进制数的BCD码存放在起始地址为3500H, 的单元中,转换出的二进制数码存入起始地址为3510H的内存 单元中,程序流程图及参考程序如图1-5所示。 2)实验步骤
(1) 输入程序并检查无误。
(2) 在3500——3507单元中存入四个十进制数(12,34,56,78)的BCD码,即E3500
↙ 输入01,02,03,04,05,06,07,08。
(3) G=2000↙,运行以上程序。
(4) D3510↙,显示结果为3510 0C 00 22 00 38 00 4E 00 (5) 反复试几组数,考查程序的正确性。
四、思考题
1、 图1-1程序,将一个五位十进制数转换为二进制数(十六位)时,这个十进制数最小可
为多少,最大又可为多少?为什么?
2、 将一个十六位二进制数转换为ASCII码十进制数时,如何确定D1的值?
3、 在十六进制数转换为ASCII码时,存转换结果后,为什么要把DX向右移四次?
因篇幅问题不能全部显示,请点此查看更多更全内容