从键盘输入数据并显示实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从键盘输入数据并显示实验报告
一、实验目的与内容
1、实验目的
掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理,并在程序中设置错误出口。
2、实验内容
编写程序,将键盘接收到的四位十六进制数按“Enter”回车键转化为二进制数,再显示在屏幕上, 按“空格键”结束!。若输入的不是0-F间的数字,则显示出错信息,并要求重新输入。
二、实验设备(环境)
1、实验设备(含芯片名称、功能简介)
微型计算机一台
2、实验环境
TPC-ZK-II集成环境
3、使用语言
汇编语言
三、实验原理(实验所用到的知识点及相关内容)
1.在TPC-ZK-II集成环境下输入汇编程序,编译、连接,生成.exe文件。
2.按提示输入数据,在屏幕显示的运行结果中查看结果是否正确。
3.输入不同的数据,可得到不同的结果。
4、参考流程图
四、实验步骤(包括步骤、代码、实验截图及其必要说明)
编写程序,将键盘接收到的 4 位 16 进制数转换为等值的二进制数,再显示在荧光屏上。
分析:整个程序分为 3 个部分:键盘输入、转换、显示,可以分别用子程序来完成。
1. 输入。输入可以利用字符串输入。这时需要在主程序中先开辟一段输入缓冲区。
字符串输入 ( 0AH 功能 ),入口参数 DS : DX = 缓冲区的首地址,( DS :DX ) = 限制最多输入的字符数,功能号 AH = 0AH,类型号 21H。
出口参数 ( DS : DX+1 ) =实际键入的字符 ( 不含回车符 ),从( DS : DX+2 ) 开始顺序存放键入的字符串,回车符 0DH为串尾最后一字符。
实现功能:等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。
注意事项:应按要求先定义缓冲区,再调用。
数据缓冲区的设置如下:
DATA SEGMENT ; 定义缓冲区
MARK DB ?
MESS DB 'input:$' ;输入字符串提示
ERROR DB 0DH,0AH,'input error!',0DH,0AH,'$' ;输入错误提示
DATA ENDS
从键盘输入‘ ABCD ’, 回车,内存的存放结果 :
子程序如下:
INPUT PROC
LEA DX, stri
MOV AH, 09H ; 调显示功能
INT 21H
LEA DX , max
MOV AH , 0AH
INT 21H ; 调 0A输入功能
RET
INPUT ENDP
2. 转换。由于在缓冲区中存放的是输入字符的 ASCII 码,比如
1→31H, A→41H ,a→61H,所以首先需要将它们转换成对应的数字的大小。
如何转换?
数字和字母的 ASCII 码是一个有序序列,数字 0~9 : 30H ~ 39H,大写字母 A~Z : 41H ~ 5AH,小写字母 a~z : 61H ~ 7AH。对于每个字符,先减去 30H,数字 0~9 就转换完了;如果判断是否大于
09H,是则减去 07H,大写字母 A~F转换完毕,如果是小写字母 a~f,还要减去20H。利用一个循环就可以将 4 个字符转换成相应的二进制数。
现在,在数据缓冲区中存放的是输入的 16进制数每一位的值,占用了 4 个字节,每个字节只用到低四位。如:输入为 ABCD,则缓冲区中存放的是: 0AH,0BH,0CH,0DH。实验要求将输入的 4 位 16 进制数转换成等值的二进制数,也就是一个字,所以还要将这 4 个字节进行组合。
组合方法如下:
将DX左移四位,腾出第四位的空间存放一位十六进制数,将此过程循环四次,就可将输入的四个十六进制数全部存放到DX中。程序如下:
MOV CL,04H
SHL DX,CL ;左移四位,第四位0补齐
XOR AH,AH ;AH清零
ADD DX,AX ;把输入的数据放入DX中
3. 显示。用“以二进制的形式显示 BX寄存器的内容”程序段来实现。程序如下:
MOV BX,DX ;把DX的数据放入BX中
SHOW: ROL BX,1 ;循环左移一位
MOV DL,BL
AND DL,01H ;屏蔽掉高7位
ADD DL,30H ;将二进制码转换为ASCLL码输出(按ASCLL码进行输出的)
MOV AH,02H ;字符数出
INT 21H ;显示二进制对应的ASCLL字符
LOOP SHOW
完整代码如下:
CRLF MACRO
MOV AH,02H ;显示器输出
MOV DL,0DH ;换行
INT 21H
MOV AH,02H
MOV DL,0AH ;回车
INT 21H
ENDM
DATA SEGMENT
MARK DB ?
MESS DB 'input:$'
ERROR DB 0DH,0AH,'input error!',0DH,0AH,'$'
DATA ENDS
STACK1 SEGMENT
STA DW 32 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX
HEAD: CRLF ;输出换行回车
MOV MARK,0
MOV AH,09H ;字符串显示
LEA DX,MESS
INT 21H
CALL GETNUM
CMP MARK,01H
JE HEAD ;输入错误,跳转到HEAD重新输入
MOV CX,0010H ;循环次数为16
MOV BX,DX ;把DX的数据放入BX中
SHOW: ROL BX,1 ;循环左移一位
MOV DL,BL
AND DL,01H ;屏蔽掉高7位
ADD DL,30H ;将二进制码转换为ASCLL码输出(按ASCLL进行输出的) MOV AH,02H ;字符数出
INT 21H ;显示二进制对应的ASCLL字符
LOOP SHOW
JMP HEAD
FINI: MOV AX,4C00H ;终止当前程序,返回调用程序
INT 21H
GETNUM PROC NEAR
XOR DX,DX ;清零
GO: MOV AH,01H
INT 21H ;键盘输入
CMP AL,0DH
JE HCHH ;输入为回车,则进行转换
CMP AL,20H