桂 林 理 工 大 学
实 验 报 告
班级 软件工程16-1班 学号 3162052051116 姓名 张识虔 同组实验者
实验名称 数码转换程序实验 日期 2018年 11 月14 日
一、实验目的:
掌握不同进制数及编码相互转换的程序设计方法
二、实验环境:
PC 微机一台、TD-PITD 实验系统一套。
三、实验内容:
计算机输入设备输入的信息一般是由 ASCII 码或 BCD 码表示的数据或字 符,CPU 一般均用二进制数进行计算或其他信息处理,处理结果的输出又必须 依照外设的要求变为 ASCII 码、BCD 码或七段显示码等。因此,在应用软件中, 各类数制的转换和代码的转换是必不可少的。计算机与外设间的数码对应关系如 表 2-3-1 所示。数码转换关系如图 2-3-1 所示。
图 2-3-1 计算机与外设间的数码转换关系
表 2-3-1 数码转换对应关系
本实验要求将缓冲区中的一个五位十进制数 00012 的 ASCII 码转换成二进 制数,并将转换结果显示在屏幕上。转换过程的参考流程如图 2-3-2 所示,根据 流程图编写程序代码。
十进制数可以表示为:Dn×10n+Dn-1×10n-1+…+D0×100=Di×10i 其中 Di 代 表十进制数 1、2、3…9、0。
上式可以转换为:ΣDi×10i=((…(Dn×10+Dn-1)×10)+Dn-2)×10+…+D1)× 10+D0。
由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位 Dn 开始 作乘 10 加次位的操作,依次类推,则可求出二进制数结果。
图 2-3-2 十进制 ASCII 转换为二进制数参考流程
DATA SEGMENT ;定义源数据段
MSR DB '00012'
LEN EQU $-MSR
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS,AX
MOV SI, OFFSET MSR
MOV CX,LEN-1
MOV AL, DS:[SI] ;开始传输数据
MOV AH,0
SUB AX,30H
NEXT1: MOV BX, 0AH
MUL BX ; 将AX中的数乘以10,所得的结果高位保存到DX中,低位保存到AX中
INC SI
MOV DL,DS:[SI]
MOV DH,0
SUB DX,30H ;将数字对应的ASCII码转换成响应的二进制数
ADD AX,DX
DEC CX
JNZ NEXT1
MOV CL,16 ; CL用作循环NEXT2的计数器,因为5位十进制数转化成二进制只有十六位,所以循环次数为16次
MOV BX,AX
NEXT2: ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H ;把BX中的数以二进制形式输出
MOV AH,2H
INT 21H
DEC CL
JNZ NEXT2
MOV AX,4C00H
INT 21H
CODE ENDS
END START
本实验要求将键盘输入的一个五位十进制数 54321 的 ASCⅡ码存放在数据 区中,转换为 BCD 码后 ,并将转换结果显示于屏幕上 。若输入的不是十进制 数的 ASCⅡ码,则输出“FF”。提示:一字节 ASCⅡ码取其低四位即变为 BCD 码。转换部分的实验流程参见 2-3-3,根据流程图编写程序代码。
本实验要求将缓冲区中存放的 000CH 的 ASCII 码转换成十进制数,并将转 换结果显示在屏幕上。转换部分的实验流程如图 2-3-4,根据流程图编写程序代 码。
十六位二进制数的值域为 0-65535,最大可转换为五位十进制数。五位十进 制数可表示为:ND=D4×104+D3×103+D2×102+D1×10+D0 因此,将十六位二进 制数转换为五位 ASCⅡ码表示的十进制数,就是求 D1-D4,并将它们转化为 ASC Ⅱ码。
图 2-3-3 十进制 ASCII 转换为 BCD 码数参考流程
DATA SEGMENT ;定义源数据段
STRING DB 'Input:','$'
MSR DB 6,?,6 DUP(?) ;数据段MSR用于接收从键盘输入的五位十进制数
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX ; 装载数据段寄存器
LEA DX, STRING
MOV AH, 09H
INT 21H
MOV DX, OFFSET MSR
MOV AH,0AH
INT 21H
MOV CL,[MSR+1] ;CL中保存实际输入的数据的位数,用于控制循环执行的次数
MOV SI,0002H
MOV BX, OFFSET MSR
NEXT1: MOV AL,[BX+SI] ;开始传输数据
CMP AL,40H
JNC LK1 ;大于等于40H则表明输入的不是数字符,跳到LK1输入F
CLC
CMP AL,30
JC LK1 ;小于30H则表明输入的不是数字字符,到LK1输出字符F
SUB AL,30H
MOV CH,0
PUSH CX
MOV CL,4
MOV DH,AL
SHL DH,CL
NEXT2: ROL DH,1
MOV DL,DH
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CL
JNZ NEXT2
POP CX
INC SI
DEC CL
JNZ NEXT1
LK1: JZ LK2
MOV DL,46H ;输出字符F
MOV AH,02H
INT 21H
INC SI
DEC CL
JNZ NEXT1
LK2: MOV AX,4C00H
INT 21H
CODE ENDS
END START
图 2-3-4 将十六进制数的 ASCII 码转换为十进制数参考流程
4.BCD 码转换为二进制码 本 实 验 要 求 将 内 存 单 元 中 的 四 个 二 位 十 进 制 数 的 BCD 码
01H,07H,03H,04H,05H,01H,06H,08H,转换成二进制数码存入其后的内存单元中, 转换结束,送屏幕显示。转换部分的实验流程参见 2-3-5,根据流程图编写程序 代码。
图 2-3-5 BCD 码转换为二进制码
DATA SEGMENT ;定义源数据段
STRING DB 'Input:','$'
MSR DW 000CH
MDR DB 5 DUP(?),'$'
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET MDR
MOV SI, 5
MOV AX,[MSR] ;将数据000CH保存到AX当中
NEXT1: DEC SI
MOV DX,0
MOV CX,0AH
DIV CX
ADD DL,30H
MOV [BX+SI],DL
CMP AX,0
JNE NEXT1
CMP SI,0 ;判断SI是否为零,为零则表明五位十进制数的每一位都不为零,否则应给前面为零的位上补上零
JE NEXT3
NEXT2: DEC SI
MOV AL,30H
MOV [BX+SI],AL
CMP SI,0
JNE NEXT2
NEXT3: MOV DX,OFFSET MDR
MOV AH,09H
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
2.3.4 实验步骤 (1) 按照各实验要求分别编写实验程序。
(2) 对实验程序进行编译、链接。
(3) 使用调试功能调试程序,观察在调试过程中,程序指令执行之后各寄存 器及数据区的内容。
(4) 更改数据区中的数据,反复测试,验证程序功能。
四、心得体会:
这个是第一次自己手打的实验 的确很难 对汇编语言还不是很熟悉 有时候答案出来了 还不是很理解是怎么转换的 很纠结 唉