Fork me on GitHub

汇编实践作业,字符串匹配

《微机与单片机系统及应用》实践报告

Created on Wed. Jun 17 00:36:12 2020

@author: 姜志成
学号:2018633007
专业:电子与计算机工程

实验说明与内容

字符串的处理是汇编语言程序设计中一个重要部分。字符串操作一般包括数据块移动、串排序、串搜索、串比较、串复制、串插入、串删除、串交换以及大小写字母转换等内容。编写字符串操作程序时经常会用到80x86串操作指令。

**模拟密码输入:假设数据库中有密码 5201314 ,用户输入一个字符串,显示的时候全都以 * 出现,然后判断用户输入的字符串是否与数据库中密码相同,若相同,输出 “ PasswordRight!” ,否则输出 “ Password Error!” **

程序完成的功能及流程图

  1. 完成老师布置的基本功能,即检查密码是否正确,输入密码时显示*
  2. 可以检查用户名是否输入正确
  3. 如果觉得输入的时候错误了,可以在输入的时候用backspace进行删除。因为正常输入密码的时候backspace也会读入进去,所以要进行特判

流程图

未命名文件.jpg

程序清单:

DATA		SEGMENT
   MSG1    DB    'USERNAME:',0DH,0AH,'$'  ; 指定用户名存放的数据区
   MSG2    DB    0DH,0AH,'PASSWORD:',0DH,0AH,'$'    ; 指定密码的数据区
   MSG3    DB    0DH,0AH,0DH,0AH,'Password Right!',0DH,0AH,'$' ; 密码正确提示
   MSG4    DB    0DH,0AH,0DH,0AH,'USERNAME Error!',0DH,0AH,'$';  ;用户名报错	
   MSG5    DB    0DH,0AH,0DH,0AH,'Password Error!',0DH,0AH,'$';  ;密码报错
   
   
   BUF1        DB    '2018633007'
   USERLEN      EQU    $-BUF1   ; 统计用户名长度
   BUF2        DB    '5201314'
   PWLEN      EQU    $-BUF2     ; 统计密码长度
   BUF3        DB    15               ; 用户输入用户名的数据区
   			DB    ?
   			DB    15    DUP(?)
   BUF4        DB    15    DUP(?)     ; 用户输入密码的数据区
DATA        ENDS


STACKS  SEGMENT   STACK     
    DW		128 DUP(?)  
STACKS  ENDS

CODE	SEGMENT
   	ASSUME    CS:CODE,DS:DATA
START:       
   	MOV    AX,DATA
   	MOV    DS,AX
   	
   	MOV    AH,9 
   	MOV    DX,OFFSET    MSG1		; 显示用户名输入界面
   	INT    21H
   	
   	MOV    AH,0AH
   	MOV    DX,OFFSET    BUF3		; 键入用户名字符串
   	INT    21H
   	
   	MOV    BX,OFFSET    BUF1		; 获得储存正确账户名的偏移地址
   	MOV    SI,OFFSET    BUF3+2		; 获得储存输入账户名的偏移地址
   	MOV    CX,USERLEN
      
CMPUSER:	
   	; 进行用户名对比
   	MOV    AL,[BX]
   	CMP    [SI],AL				; 将输入字符串的对应位置与正确账户名进行比较
   	JNZ    ERROR1				; 当前位置和原本的用户名不一样就报错
   	INC    SI
   	INC    BX
   	LOOP   CMPUSER                   ; 重复进行直到字符串结束
   	
   	MOV    AH,9
   	MOV    DX,OFFSET    MSG2         ;显示密码输入界面
   	INT    21H
   	MOV    CX,PWLEN				; 读入正确的密码长度
   	MOV    SI,OFFSET    BUF4	; 获得储存输入密码的偏移地址 
   	 
GETPW:   
   	MOV	   AH,7                        ; 逐个字符输入密码,遇到回车结束输入
   	INT	   21H
   	CMP    AL,0DH		
   	JZ	   NEXT
   	CMP    AL,08H
   	JE	   DELETE					  ; 觉得输入错误,利用backspace键删除
   	MOV    [SI],AL
   	MOV    AH,2                       ; 在屏幕上显示*
   	MOV	   DX,'*'
   	INT    21H
   	INC    SI
   	INC    BX 				; 统计输入密码的长度
   	LOOP   GETPW
   	
DELETE:
   	; 想利用backspace键进行删除
   	CMP	   BX, 00H				; 如果删除到第0个位置,再删除就直接退出
   	JZ	   EXIT
   	DEC	   BX
   	
   	CALL   DELCODE
   	MOV	   AH,2		; 调用2号中断,显示空格,消除星号
   	MOV	   DL,' '
   	INT    21H
   	MOV	   BYTE PTR [SI],00H
   	DEC    SI
   	CALL   DELCODE
   	
   	JMP    GETPW

NEXT:    
   	MOV    CX,PWLEN
   	MOV    BX,OFFSET    BUF2
   	MOV    SI,OFFSET    BUF4
   	 
CMPPW:
   	; 把输入的密码和正确的密码进行对比
   	MOV    AL,[BX]
   	CMP    [SI],AL
   	JNZ    ERROR2
   	INC    SI
   	INC    BX
   	LOOP    CMPPW              ;逐个字符比较BUF2和BUF4
   	MOV    AH,9
   	MOV    DX,OFFSET    MSG3
   	INT    21H
   	JMP    EXIT
   	
DELCODE		PROC		
   	; 删除一个字符,即把光标向左移动一格
   	MOV    AH,3		; 获取光标位置
   	INT	   10H
   	MOV	   AH,2		;2号中断:置光标位置
   	SUB    DL,1		;列数减1,实现光标左移
   	INT	   10H
   	RET
DELCODE		ENDP

   	 
ERROR1:   
   	; 用户名错误时报错
   	MOV    DX,OFFSET   MSG4 
   	CALL   DISPMSG	
ERROR2:
   	; 密码错误时报错
   	MOV    DX,OFFSET    MSG5
   	CALL   DISPMSG


DISPMSG	PROC
   	;定义一个过程,用于输出字符串
   	MOV    AH,9			;调用9号子功能
   	INT    21H			;返回DOS
   	JMP    EXIT
DISPMSG	ENDP


EXIT:    
   	MOV    AH,4CH
   	INT    21H

CODE	ENDS
END START

实验小结:

  1. 本实验要熟练掌握dos系统I/O功能调用

01H:键盘输入并回显单字符

02H:单字符显示输出

07H:键盘输入无回显

09H:显示字符串

0AH:字符串输入到缓冲区,等待读入一串字符

虽然功能号01H与07H都是等待输入一个字符,但是他们的区别是07H没有回显,因此本实验等待键入密码应调用功能号07H。

  1. 在检查输入的用户名和密码是否正确时,采取的是逐个字符比较,若相同则继续比较后一个字符,不同则停止循环并报错。
  2. 由于输入密码时,每输入一个字符,屏幕上应显示一个*,因此不宜以字符串形式输入密码,应逐个输入。
  3. 每输入一个字符,将其ASCII码和08H进行比较,若相等则捕获当前光标的位置,然后删除这个不想要的字符
  4. 每输入一个字符,将其ASCII码与0DH进行比较,目的是以回车键进行结束输入
  5. 在调用子程序的时候可以通过寄存器DX,BX等来传输参数,并且有些时候可以通过段寄存器来过渡存储数据
posted @ 2020-06-18 01:36  WalterJ726  阅读(753)  评论(0编辑  收藏  举报