一、实验目的和要求
1.掌握循环程序的编写以及结束循环的方法。
2.掌握DOS、BIOS功能调用的使用方法。
二、实验内容
(1)从BUF单元开始存有一字符串(长度<255),编程实现统计该字符串中的ASCII在42H~45H之间的字符个数,并将统计结果以二进制形式显示在屏幕。
(2)用户登录验证程序的实现
程序执行后,给出提示操作,请用户键入用户名和密码;用户在键入密码时,程序不回显键入字符;只有当用户键入的用户名,密码字符串和程序内定的字符串相同时,显示欢迎界面并返回DOS;否则给出提示信息,用户名或密码错误,再次输入。界面颜色自定(彩色或黑白)
实验代码
(1)从BUF单元开始存有一字符串(长度<255),编程实现统计该字符串中的ASCII在42H~45H之间的字符个数,并将统计结果以二进制形式显示在屏幕。
.586
DATA SEGMENT USE16
BUF DB 'B11111111XYZ' ;要判断的字符串
COUNT EQU $-BUF ;COUNT=字符串长度
DATA ENDS
CODE SEGMENT USE16
ASSUME CS: CODE, DS: DATA
BEG: MOV AX, DATA
MOV DS, AX
MOV BL, 0 ;BL=满足条件的字符个数,初始值为0
MOV SI, 0 ;BUF数组下标,初始值为0
MOV CX, COUNT
CALL COMPARE
CALL DISP
MOV AH, 4CH
INT 21H
COMPARE PROC
AGA1: CMP BUF[SI], 42H
JB NEXT1 ;<42H,jump
CMP BUF[SI], 45H
JA NEXT1 ; >45H,jump
INC BL
NEXT1: INC SI ;指向下一字符
LOOP AGA1 ;CX=COUNT
RET
COMPARE ENDP
DISP PROC ;以二进制输出
MOV CL, 8 ;长度为8位
LAST: MOV DL, '0'
RCL BL, 1 ;带进位的循环左移
JNC NEXT2 ;C=0,则跳转直接显示
MOV DL, '1' ;C=1,重新给DL赋值1
NEXT2: MOV AH, 2 ;输出DL内字符
INT 21H
LOOP LAST
RET
DISP ENDP
CODE ENDS
END BEG
(2)用户登录验证程序的实现
程序执行后,给出提示操作,请用户键入用户名和密码;用户在键入密码时,程序不回显键入字符;只有当用户键入的用户名,密码字符串和程序内定的字符串相同时,显示欢迎界面并返回DOS;否则给出提示信息,用户名或密码错误,再次输入。界面颜色自定(彩色或黑白)
;2_21.ASM
.586
DATA SEGMENT USE16
MESG1 DB 'PLEASE INPUT YOUR USER: $'
MESG2 DB 'PLEASE INPUT YOUR PASSWORD: $'
U DB 15 ;输入用户名缓冲区,预置可容纳字符数
DB ?
DB 15 DUP(?) ;输入用户名字符
PWD DB 15 DUP(?) ;输入密码字符
PLEN DB 0 ;密码的长度
USER DB 'XYZ'
ULEN EQU $-U ;用户名长度
PASSWORD DB 'B11111111'
MLEN EQU $-PASSWORD ;密码长度
WELCOME DB '-----------WELCOME!-----------$' ;提示字符
ERROR DB '------USER OR PASSWORD ERROR!------$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS: CODE, DS: DATA
BEG: MOV AX, DATA
MOV DS, AX
NEXT0: MOV AH, 9 ;09H功能号,显示DS:DL内字符串
MOV DX, OFFSET MESG1
INT 21H
MOV AH, 0AH ;键盘输入字符串并显示,存在U缓冲区
MOV DX, OFFSET U ;用户输入字符串起始偏移位置放入DX缓冲区
INT 21H
MOV AH, 2
MOV DL, 0AH ;换行字符
INT 21H
MOV AH, 9 ;显示提示字符串
MOV DX, OFFSET MESG2
INT 21H
MOV CX, MLEN
MOV SI, OFFSET PWD ;把输入密码起始偏移地址放入SI
NEXT1: MOV AH, 07H ;无回显从键盘读入一个字符
INT 21H
CMP AL, 0DH ;判断输入是否结束
JE IND
MOV [SI], AL ;将输入密码字符放入数据区:PWD
MOV AH, 2 ;每输入一位密码显示一个‘*’
MOV DL, '*'
INT 21H
INC PLEN
INC SI
JMP NEXT1
IND: MOV AH, 2 ;输出换行
MOV DL, 0AH
INT 21H
MOV BX, OFFSET U+1 ;[BX]=实际输入字符数
MOV AL, [BX]
CMP AL, ULEN ;比较用户名长度
MOV BX, OFFSET USER
MOV SI, OFFSET U+2
MOV CX, ULEN ;设置循环次数
NEXT2: MOV AL, [BX]
CMP [SI], AL ;循环比较用户名是否正确
INC SI
INC BX
LOOP NEXT2
MOV BX, OFFSET PASSWORD
MOV SI, OFFSET PWD
MOV CL, PLEN
MOV CH, 0
CMP CX, MLEN ;比较密码长度
JNZ ERR
MOV CX, MLEN
NEXT3: MOV AL, [BX]
CMP [SI], AL ;循环比较密码字符是否正确
JNZ ERR
INC SI
INC BX
LOOP NEXT3
JMP WEL
ERR: MOV AH, 9
MOV DX, OFFSET ERROR ;输出用户名或密码错误提示
INT 21H
MOV AH, 2
MOV DL, 0AH
INT 21H
JMP NEXT0
WEL: MOV AH, 9 ;输出登录成功的提示
MOV DX, OFFSET WELCOME
INT 21H
JMP EXIT
EXIT: MOV AH, 4CH
INT 21H
CODE ENDS
END BEG
实验过程描述与结果分析
(1)判断已经设定好的字符串中的ASCII在42H~45H之间的字符个数,将统计结果以二进制形式显示在屏幕。
结果如下图:
首先在里面定义字符串“B11111111XYZ”利用count存储字符串长度。用BL存储字符串中符合题目条件的字符个数。SI赋值为字符串的下标,初始值为0。调用compare和disp子程序进行比较判断。
在compare子程序里,字符小于42H或者大于45H则跳转到next1指向下一个字符。循环判断操作,遇到满足条件的字符串则计数。
disp实现8位二进制输出,含进位的循环左移,若C标为0则跳转直接显示,若C标为1则重新给DL赋值为1,输出DL内字符。
(2)用户登录验证程序的实现
结果如下图:
首先在程序中设定好用户名和密码,为用户名设定缓冲区,利用EQU程序指令记录用户名和密码长度,让程序更加灵活。利用DOS功能调用09H,显示提示语句。用0AH讲键入的字符串保存到缓冲区并在屏幕上显示。换行后显示提示语输入密码。输入一位密码不显示字符但显示一个“*”。比较用户名和密码判断是否输入正确。