数码转换 实验报告 微机原理_微机原理实验报告
数码转换 实验报告 微机原理由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“微机原理实验报告”。
实验九
数码转换
一、实验目的1、掌握计算机常用数据编码之间的相互转换方法。
2、进一步熟悉DEBUG软件的使用方法。
二、实验内容
1.ACSII码转换为非压缩型BCD码
编写并调试正确的汇编语言源程序,使之实现:设从键盘输入一串十进制数,存入DATA1单元中,按回车停止键盘输入。将其转换成非压缩型(非组合型)BCD码后,再存入DATA2开始的单元中。若输入的不是十进制数,则相应单元中存放FFH。调试程序,用D命令检查执行结果。
2.BCD码转换为二进制码
编写并调试正确的汇编语言源程序,使之将一个16位存储单元中存放的4位BCD码DATA1,转换成二进制数存入DATA2字单元中。调试程序,用D命令检查执行结果。3.十六进制数转换为ASCII码
编写并调试正确的汇编语言源程序,使之将内存DATA1字单元中存放的4位十六进制数,转换为ASCⅡ码后分别存入DATA2为起始地址的4个单元中,低位数存在低地址的字节中,并在屏幕上显示出来。
三、实验预习
1.复习材料中有关计算机数据编码部分的内容。2.按要求编写程序。
四、实验步骤
1.编辑源文件,经汇编连接产生EXE文件。2.用DEBUG调试、检查、修改程序。
五、实验内容
1.ACSII码转换为非压缩型BCD码 STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(?)
;为堆栈段留出256个字节单位
STACK ENDS DATA SEGMENT PARA 'DATA';定义数据段
DATA1 DB 32
;缓冲区最大长度
DB ? DB 32 DUP(?)DATA2 DB 32 DUP(?)DATA ENDS CODE SEGMENT
;定义代码段 ASSUME SS:STACK ASSUME CS:CODE ASSUME DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,DATA1
;规定:DX存放输入字符串的缓冲区首地址 MOV AH,0AH INT 21H
;字符串输入 AL=键入的ASCII码 LEA SI,DATA1 LEA DI,DATA2 INC SI MOV CL,[SI] INC SI LP1: MOV AL,[SI] SUB AL,30H CMP AL,0 JL LP2 CMP AL,9 JG LP2 MOV BL,AL MOV [DI],BL INC DI INC SI DEC CL JMP LP1 LP2: MOV AL,0FFH MOV BL,AL MOV [DI],BL INC DI INC SI DEC CL CL=CL-1 JNZ LP1 LP3: MOV AH,4CH INT 21H CODE ENDS END START
;DI存放DATA2首地址
;取输入字符串长度
;指向第一个输入字符
;输入的字符存为ASCII码,将其转换成十进制数
;若AL
;若AL>9(AL-9>0),跳转到LP2
;将AL->BL
;将结果存到DATA2开始的单元中
;若输入的不是十进制数,在相应的单元存放FFH
;以字母开头的十六进制数前面需加'0'
;将AL->BL
;CL=0,执行LP3中的语句
2.BCD码转换为二进制码
DATA
SEGMENT
DATA1 DW 2497H
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
;指4位BCD码
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
;进行累加,直接将最后的累加结果放到AX中
MOV DATA2,AX
MOV AH,4CH
INT 21H
CODE
ENDS
END START
3.十六进制数转换为ACSII码 STACK
SEGMENT
DB 256 DUP(?)
STACK
ENDS
DATA
SEGMENT
DATA1 DB 24H,06DH
DATA2 DB 4 DUP(?)
;存放ASCII码
JUMP DB 4 DUP(?)
;4位十六进制数分别存放在DATA3的4个字节中
DATA ENDS
CODE
SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA SI,DATA1
LEA DI,JUMP
MOV CL,2
;循环2次,取两次两位十六进制数
LP0:
MOV AL,[SI]
;取2位十六进制数
AND AL,0F0H
;低四位为零
ROR AL,4
;右移4位
相当于除以16
MOV [DI],AL
;高位数存放在高地址字节中
INC DI
MOV AL,[SI]
;取2位十六进制数
AND AL,0FH
;高四位为零
MOV [DI],AL
;低位数存放在低地址字节中
INC SI
INC DI
DEC CL
JNZ LP0
LEA SI,JUMP
LEA DI,DATA2
MOV CL,4
LP1:
MOV AL,[SI]
CMP AL,9
JG LP3
ADD AL,30H
JMP LP3
LP2:
ADD AL,37H
LP3:
MOV [DI],AL
INC DI
INC SI
DEC CL
JNZ LP1
MOV AH,09H
INT 21H
MOV DX,OFFSET DATA2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE
ENDS
END START
;SI=JUMP的首地址偏移量
;DI=DATA2的首地址偏移量
;因为是四位十六进制数,所以设置为循环4次
;取JUMP中的十六进制数
;若AL>9(AL-9>0),跳转到LP3
;0~9H+30H=ASCII
;A~FH+30H=ASCII
;将ASCII码依次存入DATA2中
六、实验习题与思考
1.编程实现:从键盘上输入两位十六进制数,转换成十进制数后显示在屏幕上。STACK SEGMENT
DB
256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB
5,?,2 DUP(?)
DATA2 DBDUP(?)
DATA3 DBDUP(?)
DATA ENDS
CODE SEGMENT
ASSUME
SS:STACK,DS:DATA,CS:CODE
START:MOV
AX,DATA
MOV
DS,AX
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]
;取百位数送显
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 DBDUP(0)
COUNT EQU
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