南京邮电大学汇编语言程序设计实验二:用户登录验证程序的设计

一、实验目的和要求

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讲键入的字符串保存到缓冲区并在屏幕上显示。换行后显示提示语输入密码。输入一位密码不显示字符但显示一个“*”。比较用户名和密码判断是否输入正确。

  • 17
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookie爱吃小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值