北京工业大学 微机原理 实验九 数码转换实验报告.docx
《北京工业大学 微机原理 实验九 数码转换实验报告.docx》由会员分享,可在线阅读,更多相关《北京工业大学 微机原理 实验九 数码转换实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
北京工业大学微机原理实验九数码转换实验报告
微机原理实验报告
——实验九数码转换
姓名:
学号:
一、实验目的
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码
STACKSEGMENTPARASTACK'STACK'
DB256DUP(?
);为堆栈段留出256个字节单位
STACKENDS
DATASEGMENTPARA'DATA';定义数据段
DATA1DB32;缓冲区最大长度=最多键入字符个数(31)+1*注:
+1为回车
DB?
;存入的实际输入字符个数,dos返回时自动填入
DB32DUP(?
);输入ACSII码缓冲区(31+1)*注:
+1为回车键
DATA2DB32DUP(?
);转换后BCD码的缓冲区(31+1)*注:
+1为回车
DATAENDS
CODESEGMENT;定义代码段
ASSUMESS:
STACK
ASSUMECS:
CODE
ASSUMEDS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,DATA1;规定:
DX存放输入字符串的缓冲区首地址
MOVAH,0AH
INT21H;字符串输入AL=键入的ASCII码
LEASI,DATA1;SI存放输入字符串的缓冲区DATA1首地址
LEADI,DATA2;DI存放DATA2首地址
INCSI
MOVCL,[SI];取输入字符串长度
INCSI;指向第一个输入字符
LP1:
MOVAL,[SI]
SUBAL,30H;输入的字符存为ASCII码,将其转换成十进制数
CMPAL,0;若AL<0(AL-0<0),跳转到LP2
JLLP2
CMPAL,9;若AL>9(AL-9>0),跳转到LP2
JGLP2
MOVBL,AL;将AL->BL
MOV[DI],BL;将结果存到DATA2开始的单元中
INCDI
INCSI
DECCL
JMPLP1
LP2:
MOVAL,0FFH;若输入的不是十进制数,在相应的单元中存放FFH
;以字母开头的十六进制数前面需加'0'
MOVBL,AL;将AL->BL
MOV[DI],BL
INCDI
INCSI
DECCL;CL=CL-1
JNZLP1;CL=0,执行LP3中的语句
LP3:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
流程图
N
Y
N
Y
实验内容
(二):
BCD码转换为十六进制码
DATASEGMENT
DATA1DW2497H
DATA2DW?
DATAENDS
CODESEGMENT
ASSUMESS:
STACK,CS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
XORBX,BX;累加单元清0(BX=0)
MOVSI,0AH;设置乘数10
MOVCL,4;指4位BCD码
MOVCH,3;循环次数=3
MOVAX,DATA1;取十进制数
LP:
ROLAX,CL;取数字
MOVDI,AX;保存当前AX值
ANDAX,0FH;屏蔽高位
ADDAX,BX;累加
MULSI
MOVBX,AX
MOVAX,DI
DECCH;循环次数减1
JNZLP
;以上完成循环三次,个位不用再*10,所以不用最后不用放入循环中去
ROLAX,CL;取个位数字
ANDAX,0FH;屏蔽高位
ADDAX,BX;进行累加,直接将最后的累加结果放到AX中
MOVDATA2,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2497H=(09C1)8
流程图
实验(三):
十六进制转换为ASCII码
STACKSEGMENT
DB256DUP(?
)
STACKENDS
DATASEGMENT
DATA1DB24H,06DH
DATA2DB4DUP(?
);存放ASCII码
JUMPDB4DUP(?
);4位十六进制数分别存放在DATA3的4个字节中
DATAENDS
CODESEGMENT
ASSUMESS:
STACK,DS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEASI,DATA1
LEADI,JUMP
MOVCL,2;循环2次,取两次两位十六进制数
LP0:
MOVAL,[SI];取2位十六进制数
ANDAL,0F0H;低四位为零
RORAL,4;右移4位相当于除以16
MOV[DI],AL;高位数存放在高地址字节中
INCDI
MOVAL,[SI];取2位十六进制数
ANDAL,0FH;高四位为零
MOV[DI],AL;低位数存放在低地址字节中
INCSI
INCDI
DECCL
JNZLP0
LEASI,JUMP;SI=JUMP的首地址偏移量
LEADI,DATA2;DI=DATA2的首地址偏移量
MOVCL,4;因为是四位十六进制数,所以设置为循环4次
LP1:
MOVAL,[SI];取JUMP中的十六进制数
CMPAL,9
JGLP3;若AL>9(AL-9>0),跳转到LP3
ADDAL,30H;0~9H+30H=ASCII
JMPLP3
LP2:
ADDAL,37H;A~FH+30H=ASCII
LP3:
MOV[DI],AL;将ASCII码依次存入DATA2中
INCDI
INCSI
DECCL
JNZLP1
MOVAH,09H
INT21H
MOVDX,OFFSETDATA2
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
流程图
六.实验习题与思考
1.编程实现:
从键盘上输入两位十六进制数,转换成十进制数后在屏幕上显示出来。
源代码:
STACKSEGMENT
DB256DUP(?
)
STACKENDS
DATASEGMENT
DATA1DB5,?
2DUP(?
)
DATA2DB2DUP(?
)
DATA3DB2DUP(?
)
DATAENDS
CODESEGMENT
ASSUMESS:
STACK,DS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEADX,DATA1
MOVAH,0AH
INT21H;输入字符串
LEASI,DATA1+2
LEADI,DATA2
MOVCL,2
;将ASC码转换为十六进制数
LP1:
MOVAL,[SI]
SUBAL,30H
CMPAL,9
JALP2
MOV[DI],AL
INCDI
INCSI
DECCL
JZLP3
JNZLP1
LP2:
SUBAL,7
MOV[DI],AL
INCDI
INCSI
DECCL
JNZLP1
;将十六进制数转换成十进制数,并保存
LP3:
LEADI,DATA2
MOVAL,[DI]
MOVBL,[DI+1]
MOVCL,4
SHLAL,CL
ADDAL,BL
MOV[DI],AL
LEASI,DATA3
XORAH,AH
MOVCL,100
DIVCL;AH=AX%100,AL=AX/100
MOV[SI],AL;保存百位数
MOVAL,AH
XORAH,AH
MOVCL,10
DIVCL
MOV[SI+1],AL;保存十位数
MOV[SI+2],AH;保存个位数
;屏幕显示十进制数
LP4:
MOVDL,[SI];取百位数送显
ORDL,30H
MOVAH,02H
INT21H
MOVDL,[SI+1];取十位数送显
ORDL,30H
MOVAH,02H
INT21H
MOVDL,[SI+2];取个位数送显
ORDL,30H
MOVAH,02H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.十进制转换为七段码。
提示:
为了在七段显示器上显示十进制数,需要把十进制数转换为七段代码。
转换可采用查表法。
设需要转换的十进制数已存放在起始地址为DATA1区域中,七段码转换表存放在起始地址为TABLE表中,转换结果存放到起始地址为DATA2区域。
若待转换的数不是十进制数,则相应结果单元内容为00H。
STACKSEGMENT
DB256DUP(?
)
STACKENDS
DATASEGMENT
DATA1DB0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'A','B','C','$'
TABLEDB00H,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;实际数据定义必须在同一行
DATA2DB16DUP(0)
COUNTEQU2
DATAENDS
CODESEGMENT
ASSUMESS:
STACK,DS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEASI,DATA1
LEABX,DATA2
LEADI,TABLE
XORAH,AH
LP1:
MOVAL,[SI];外循环DATA1指向下一个
INCSI
MOVCX,16;内循环TABLE16次
LP2:
CMP[DI],AL
JELP3
ADDDI,COUNT;内循环TABLE指向下一组
DECCX
JNZLP2
MOVBYTEPTR[BX],00H;若不是十进制数,则结果保存为00H
INCBX
CMPAL,'$';设置结束标志
JNZLP1
JZLP4
LP3:
MOVAL,[DI+1]
MOV[BX],AL;转换结果保存在DATA2中
INCBX
LEADI,TABLE
CMPCL,0
JNZLP1
LP4:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART