北京工业大学微机原理实验九
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九数码转换
一、实验目的
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 ; DI存放DATA2首地址
INC SI
MOV CH,0
MOV CL,[SI] ; 取输入字符串长度
INC SI ; 指向第一个输入字符
LP1:
MOV AL,[SI]
SUB AL,30H ; 输入的字符存为ASCII码,将其转换成十进制数
CMP AL,0 ; 若AL<0(AL-0<0),跳转到LP2
JL LP2
CMP AL,9 ; 若AL>9(AL-9>0),跳转到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
CMP CL,0
JNZ LP1 ; CL=0,执行LP3中的语句
LP3:
MOV AH,4CH
INT 21H
CODE ENDS
END START
2. BCD码转换为二进制码
DATA SEGMENT
DATA1 DW 2497H
DATA2 DW
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE
ASSUME 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 ;以上完成循环三次,个位不用再*10,所以不用最后不用放入循环中去
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 CH,2 ; 循环2次,取两次两位十六
进制数
LP0:
MOV AL,[SI] ; 取2位十六进制数
AND AL,0F0H ; 低四位为零
MOV CL,4
ROR AL,CL ; 右移4位相当于除以16 MOV [DI],AL ; 高位数存放在高地址字节
中
INC DI
MOV AL,[SI] ; 取2位十六进制数
AND AL,0FH ; 高四位为零
MOV [DI],AL ; 低位数存放在低地址字节
中
INC SI
INC DI
DEC CH
JNZ LP0
LEA SI,JUMP ; SI=JUMP的首地址偏移量
LEA DI,DATA2 ; DI=DATA2的首地址偏移
量
MOV CH,4 ; 因为是四位十六进制数,所以设
置为循环4次