8086/8088汇编过程练习 实现登录界面及其验证

;2020,10,26 复习汇编过程中  

;程序说明,采用子过程编程   输入的用户名和密码放在数据段里面,内置的用户名和密码放在附加段里面

title 登录界面及验证
data segment
mess1 db 'personal_computer'
tishi db '        welcome to my first page','$'
name_sign db '        login:','$'
passwd_sign db '        password:','$'
enter db 0ah,'$'
error db 'error','please restart input your name','$'
error1 db 'error','please restart input your password','$'
denglu1 db '    **************************************************','$'    ;登录界面提示符
denglu db '    ****welcome to kali linux!!! hacker nanfengnan****','$'
denglu2 db '    **************************************************','$'
name1 db 10 dup(?)
passwd1 db 10 dup(?)
count db 0   ;计数器·用来记录用户名,和密码的长度
data ends

extra segment
namet db 4 dup('root')
passwdt db 3 dup('123')
extra ends

stack segment stack
pe db 100 dup(0)
stack ends

code segment
assume cs:code,ds:data,es:extra,ss:stack
main proc
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov ax,stack
mov ss,ax
mov sp,98
mov bp,98

lea dx,tishi   ;输出提示信息
mov ah,9
int 21h  ;中断调用
call enter1

call sign ;用户名提示符
               
call input_name ;输入用户名
call yanzheng_name ;验证用户名
call sign1   ;密码提示符
call input_passwd ;输入密码
call yanzheng_passwd  ;验证密码

call enter1
lea dx,denglu1
mov ah,9
int 21h
call enter1
lea dx,denglu
int 21h
call enter1
lea dx,denglu2
int 21h

mov ah,4ch
int 21h
main endp
    
enter1 proc
push ax
push dx
lea dx,enter
mov ah,9
int 21h
pop dx
pop ax
ret
enter1 endp        
        
;过程1  提示信息用户名
sign proc
lea dx,name_sign
int 21h
ret
sign endp

;过程2
sign1 proc  
lea dx,passwd_sign
mov ah,9
int 21h
ret
sign1 endp                    
       
;输入用户名的过程  送入name1中,输入换行结束输入,把数据存入name1
input_name proc
and [count],0   ;保证·每次的·次数·正确
push ax    ;保护现场
push si
mov si,0
t:
mov ah,1
int 21h
cmp al,0dh  ;0dh是换行
jz e
inc [count]
mov name1[si],al
inc si
jmp t

e:
pop si
pop ax
ret
input_name endp   

;输入密码
input_passwd proc
and [count],0   ;保证·每次的·次数·正确
push ax    ;保护现场
push si
mov si,0
tf:    ;死循环输入,换行结束
mov ah,8    ;改进,使用8号功能,不显示输入,出口在al中,改进图片在最下面
int 21h
cmp al,0dh  ;0dh是换行
jz ef
inc [count]     ;计数器用来判断长度,root正确密码,防止rootjfjdf也能登陆
mov passwd1[si],al   ;密码存入数据段的passwd1里面
inc si
jmp tf

ef:
pop si
pop ax
ret
input_passwd endp



;验证用户名是否正确,name和name1字符串比较  cmpsb rep
yanzheng_name proc
push si   ;保护寄存器
push di
push ax
push dx
push cx

t1:
lea si,name1
lea di,namet
mov cx,4
cld
repz cmpsb
cmp cx,0
jz ed
tt:
lea dx,error  ;用户名错误输出error
mov ah,9
int 21h
lea dx,enter
int 21h
call sign
call input_name
jmp t1

ed:
cmp [count],4
jnz tt

pop cx
pop dx
pop ax
pop di
pop si
ret
yanzheng_name endp
      
      
yanzheng_passwd proc
push si   ;保护寄存器
push di
push ax
push dx
push cx

t11:
lea si,passwd1
lea di,passwdt
mov cx,3
cld
repz cmpsb     ;zf=1(相等),cx不等于0时,循环
cmp cx,0
jz e22
tt1:
lea dx,error1  ;密码错误输出error1
mov ah,9
int 21h
lea dx,enter
int 21h
call sign1
call input_passwd   ;重新输入密码
jmp t11

e22:
cmp [count],3
jnz tt1

pop cx
pop dx
pop ax
pop di
pop si
ret

yanzheng_passwd endp      
      
   
          
code ends
    end start






 

 

原文地址:https://www.cnblogs.com/nanfengnan/p/13877980.html