北京工业大学 09 级电子信息工程实验班
1
实验九 数码转换
一、 实验目的
1. 掌握计算机常用数据编码之间的相互转换方法。
2. 进一步熟悉 DEBUG 软件的使用方法。
二、 实验内容
1. ASCⅡ码转换为非压缩型 BCD码
编写并调试正确的汇编语言源程序,使之实现:设从键盘输入一串十进制数,存入
DATA1单元中,按回车停止键盘输入。将其转换成非压缩型(非组合型)BCD码后,
再存入 DATA2 开始的单元中。若输入的不是十进制数,则相应单元中存放 FFH。调
试程序,用 D 命令检查执行结果。
2. BCD码转换为二进制数
编写并调试正确的汇编语言源程序,使之将一个 16 位存储单元中存放的 4 位 BCD
码 DATA1,转换成二进制数存入 DATA2字单元中调试程序,用 D命令检查执行结果。
3. 十六进制数转换为 ASCⅡ码
编写并调试正确的汇编语言源程序,使之将内存 DATA1字单元中存放的 4位十六进
制数,转换为 ASCⅡ码后分别存入 DATA2 为起始地址的 4 个单元中,低位数存在低
地址的字节中,并在屏幕上显示出来。
三、 实验预习
1. 复习材料中有关计算机数据编码部分的内容。
2. 按要求编写程序。
四、 实验步骤
1. 编辑源文件,经汇编连接产生 EXE文件。
2. 用 DEBUG调试、检查、修改程序。
实验内容(一) ASCⅡ码转换为非压缩型 BCD码
源代码:
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT PARA 'DATA' ;定义数据段
DATA1 DB 21,?,21 DUP(?) ;内存中建立缓冲区,第一个字节保存最大字符数,
;第二个字节存放实际输入字符数(回车除外),
;DOS返回时自动填入,第三个字节开始存放输入的字符
DATA2 DB 21 DUP(?)
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME SS:STACK,CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,DATA1 ;规定:DX存放输入字符串的缓冲区首地址
MOV AH,0AH ;字符串输入
INT 21H
LEA SI,DATA1 ;SI 存放输入字符串的缓冲区 DATA1首地址
LEA DI,DATA2 ;DI 存放 DATA2首地址
北京工业大学 09 级电子信息工程实验班
2
INC SI
MOV CL,[SI] ;取输入字符串长度
INC SI ;指向第一个输入字符
LP1: MOV AL,[SI]
SUB AL,30H ;输入的字符存为 ASC码
CMP AL,0 ;若 AL<0,跳转到 LP2
JL LP2
CMP AL,9 ;若 AL>9,跳转到 LP2
JG LP2
MOV BL,AL ;将 AL->BL
MOV [DI],BL ;将结果存到 DATA2 开始的单元中
INC DI
INC SI
DEC CL
JMP LP1
LP2: MOV AL,0FFH ;若输入的不是十进制数,在相应的单元中存放 FFH
;以字母开头的十六进制数前面需加'0'
MOV BL,AL ;将 AL->BL
MOV [DI],BL
INC DI
INC SI
DEC CL ;CL=CL-1
JNZ LP1 ;CL=0,执行 LP3中的语句
LP3: MOV AH,4CH
INT 21H
CODE ENDS
END START
调试过程:
备注:(1)输入的数据在内存中是以 ASCⅡ码形式存储的。
(2)OAH 号功能使用说明:从键盘输入一串字符并把它存入用户指定的缓冲区。缓冲
区的第一个字节单元为允许键入字符的个数 N,第二个字节单元为实际输入字符个
数,第三个字节单元开始存放键入字符的 ASCⅡ码,之后字节单元存放结束标志 0DH,
故需要开辟的缓冲区空间应为 N+3。
实验内容(二) BCD码转换为二进制数
北京工业大学 09 级电子信息工程实验班
3
源代码:
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DW 1234H
DATA2 DW ?
DATA ENDS
CODE SEGMENT
ASSUME SS:STACK,CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR BX,BX ;累加单元清 0(BX=0)
MOV SI,0AH ;设置乘数 10
MOV CL,4
MOV CH,3 ;设置循环次数 3
MOV AX,DATA1 ;取十进制数
LP: ROL AX,CL ;取数字
MOV DI,AX ;保存当前 AX值
AND AX,0FH ;屏蔽高位
ADD AX,BX ;累加
MUL SI
MOV BX,AX
MOV AX,DI
DEC CH ;循环次数减 1
JNZ LP
ROL AX,CL ;取个位数字
AND AX,0FH ;屏蔽高位
ADD AX,BX ;累加
MOV DATA2,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
调试过程:
转换过程:(1234H)16(0001 0010 0011 0100)2(1234)10(04D2)16
实验内容(三) 十六进制数转换为 ASCⅡ码
北京工业大学 09 级电子信息工程实验班
4
源代码:
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB 12H,02CH ;4 位十六进制数
DATA2 DB 5 DUP(?) ;存放 ASC码
DATA3 DB 4 DUP(?) ;4 位十六进制数分别存放在 DATA3的 4个字节中
LFCR DB 0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
LEA SI,DATA1
LEA DI,DATA3
MOV CL,2 ;循环 2次
LP1: MOV AL,[SI] ;取 2位十六进制数
AND AL,0F0H ;屏蔽低四位
ROR AL,4 ;右移 4位
MOV [DI],AL ;高位数存放在高地址字节中
INC DI
MOV AL,[SI] ;取 2位十六进制数
AND AL,0FH ;屏蔽高四位
MOV [DI],AL ;低位数存放在低地址字节中
INC SI
INC DI
DEC CL
JNZ LP1
LEA SI,DATA3 ;将 DATA3的首地址偏移量赋给 SI
LEA DI,DATA2 ;将 DATA2的首地址偏移量赋给 DI
MOV CL,4 ;循环 4次
LP2: MOV AL,[SI] ;取 DATA3中的十六进制数
CMP AL,9
JG LP3 ;若 AL>9,跳转到 LP3
ADD AL,30H ;十六进制数 0-9->ASC 码,要加 30H
JMP LP4
LP3: ADD AL,37H ;十六进制数 A-F->ASC码,要加 37H
LP4: MOV [DI],AL ;将 ASC码依次存入 DATA2中
INC DI
INC SI
DEC CL
JNZ LP2
MOV AL,'$' ;设置显示结束标志
北京工业大学 09 级电子信息工程实验班
5
MOV [DI+1],AL ;存入 DATA2中
LEA DX,LFCR
MOV AH,09H
INT 21H ;回车换行
MOV DX,OFFSET DATA2
MOV AH,09H
INT 21H ;显示 ASC码
MOV AH,4CH
INT 21H
CODE ENDS
END START
调试过程:
五、 实验习题与思考
1. 编程实现:从键盘上输入两位十六进制数,转换成十进制数后在屏幕上显示出来。
源代码:
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB 5,?,2 DUP(?)
DATA2 DB 2 DUP(?)
DATA3 DB 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
北京工业大学 09 级电子信息工程实验班
6
LEA DX,DATA1
MOV AH,0AH
INT 21H ;输入字符串
LEA SI,DATA1+2
LEA DI,DATA2
MOV CL,2
;将 ASC码转换为十六进制数
LP1: MOV AL,[SI]
SUB AL,30H
CMP AL,9
JA LP2
MOV [DI],AL
INC DI
INC SI
DEC CL
JZ LP3
JNZ LP1
LP2: SUB AL,7
MOV [DI],AL
INC DI
INC SI
DEC CL
JNZ LP1
;将十六进制数转换成十进制数,并保存
LP3: LEA DI,DATA2
MOV AL,[DI]
MOV BL,[DI+1]
MOV CL,4
SHL AL,CL
ADD AL,BL
MOV [DI],AL
LEA SI,DATA3
XOR AH,AH
MOV CL,100
DIV CL ;AH=AX%100,AL=AX/100
MOV [SI],AL ;保存百位数
MOV AL,AH
XOR AH,AH
MOV CL,10
DIV CL
MOV [SI+1],AL ;保存十位数
MOV [SI+2],AH ;保存个位数
;屏幕显示十进制数
LP4: MOV DL,[SI] ;取百位数送显
北京工业大学 09 级电子信息工程实验班
7
OR DL,30H
MOV AH,02H
INT 21H
MOV DL,[SI+1] ;取十位数送显
OR DL,30H
MOV AH,02H
INT 21H
MOV DL,[SI+2] ;取个位数送显
OR DL,30H
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
调试过程:
输入:
输出:
2. 十进制转换为七段码。
提示:为了在七段显示器上显示十进制数,需要把十进制数转换为七段代码。转换
可采用查
法。设需要转换的十进制数已存放在起始地址为 DATA1区域中,七段码
转换表存放在起始地址为 TABLE表中,转换结果存放到起始地址为 DATA2区域。若
待转换的数不是十进制数,则相应结果单元内容为 00H。
源代码:
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'A','B','C','$'
TABLE DB 00H,40H,01H,79H,02H,24H,03H,30H,04H,19H,05H,12H,06H,02H,
07H,78H,08H,00H,09H,18H,0AH,08H,0BH,03H,0CH,46H,0DH,21H,
0EH,06H,0FH,0EH ;实际数据定义必须在同一行
DATA2 DB 16 DUP(0)
北京工业大学 09 级电子信息工程实验班
8
COUNT EQU 2
DATA ENDS
CODE SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
LEA SI,DATA1
LEA BX,DATA2
LEA DI,TABLE
XOR AH,AH
LP1: MOV AL,[SI] ;外循环 DATA1指向下一个
INC SI
MOV CX,16 ;内循环 TABLE 16次
LP2: CMP [DI],AL
JE LP3
ADD DI,COUNT ;内循环 TABLE指向下一组
DEC CX
JNZ LP2
MOV BYTE PTR[BX],00H ;若不是十进制数,则结果保存为 00H
INC BX
CMP AL,'$' ;设置结束标志
JNZ LP1
JZ LP4
LP3: MOV AL,[DI+1]
MOV [BX],AL ;转换结果保存在 DATA2中
INC BX
LEA DI,TABLE
CMP CL,0
JNZ LP1
LP4: MOV AH,4CH
INT 21H
CODE ENDS
END START
调试过程: