实验三 从键盘输入数据并显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2 从键盘输入数据并显示
编写程序,将键盘接收到的4位16进制数转换为等值的二进制数,再显示在荧光屏上。
分析:整个程序分为3个部分:键盘输入、转换、显示,可以分别用子程序来完成。
1. 输入。输入可以利用字符串输入。这时需要在主程序中先开辟一段输入缓冲区。
先复习一下字符串输入的知识。
字符串输入 ( 0AH 功能 )
入口参数 DS : DX = 缓冲区的首地址
( DS :DX ) = 限制最多输入的字符数
功能号 AH = 0AH
类型号 21H
出口参数 ( DS : DX+1 ) = 实际键入的字符(不含回车符) 从( DS : DX+2 )开始顺序存放键入的字符串,
回车符0DH为串尾最后一字符。
实现功能等待从键盘输入字符串,并存入设定的缓冲区内,
同时回显字符串,光标随着移动,
回车符使光标回到行
首。
注意事项:应按要求先定义缓冲区,再调用。
数据缓冲区的设置如下:
data SEGMENT ;定义缓冲区
stri DB ‘PLEASE INPUT’ ,0AH,0DH, ’$’ ;输入提示
max DB 4 ;定义限制最多输入个数
lenth DB ? ;用于存放实际输入个数
stri DB 5 DUP(?) ;用于存放输入的字符串
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,所以首先需要将它们转换成对应的数字的大小。如1→0000,0001B,A和a→1010。
如何转换?
数字和字母的ASCII码是一个有序序列
数字0~9 : 30H ~ 39H
大写字母A~Z : 41H ~ 5AH
小写字母a~z : 61H ~ 7AH
对于每个字符,先减去30H,数字0~9就转换完了;如果判断是否大于09H,是则减去07H,大写字母A~F转换完毕,如果是小写字母a~f,还要减去20H。
假设用SI间指数据缓冲区,程序段如下:
MOV AL, [SI] ;应用输入字符
SUB AL,30H
CMP AL,
09H ;大于09H, 则为字符
JLE LOOP1
;为字母A~F的ASCII
SUB AL, 07H
LOOP1: CMP AL, 20H
JLE NEXT1
;为字母a~f的ASCII
SUB AL, 20H
NEXT1: ……
;后续处理
利用一个循环就可以将4个字符转换成相应的二进制数。
现在,在数据缓冲区中存放的是输入的16进制数每一位的值,占用了4个字节,每个字节只用到低四位。
如:输入为ABCD,则缓冲区中存放的是:0AH,0BH,0CH,0DH。
实验要求将输入的4位16进制数转换成等值的二进制数,也就是一个字,所以还要将这4个字节进行组合。
组合方法如下:
取出最高的两位,如0AH,0BH,放入寄存器AX中,(注意:AH=0BH,AL=0AH),将AL左移4位,变成A0H,和AH相“或”,得到AL=ABH,存入BH寄存器;同理将后两个字节组合成一个字节,存入BL寄存器。
3. 显示。可以调用“以二进制的形式显示BX寄存器的内容”子程序来实现。合成部分的程序段:
MOV CX,4 ;移位次数
LEA SI , STRI ;取前两个字节送AX
MOV AX, [SI]
SHL AL,CL ;AL左移四位
OR AL,AH
MOV BH , AL ;保
存
LEA SI , STRI+2
MOV AX, [SI]
SHL AL,CL
OR AL,AH
MOV BL , AL
主程序:
code SEGMENT
ASSUME CS:code, DS:data
start: MOV AX , data ;置缓冲区地址于DS:DX
MOV DS , AX
LEA DX, stri
MOV AH, 09H ;调显示功能
INT 21H
LEA DX , max
MOV AH , 0AH
INT 21H
CALL CHANGE ; 转换
……
;组合
CALL DISPLAY ; 显示
……
;返回DOS
……
;各个子程序
……
;结束