大二下学期的汇编语言大作业
模拟密码输入:假设数据库中有密码5201314,用户输入一个字符串,显示的时候全都以*出现,然后判断用户输入的字符串是否与数据库中密码相同,若相同,输出“Password Right!”,否则输出 “Password Error!”
提示:将“Password Right!”、“Password Error!”以及5201314定义为字符串
若是密码输错三次,有三次重新输入机会,并且输入过程中,发现密码错误,则是按下delete键再继续输入。
下面是EXPERIEN.asm文件
data segment
password db 30 dup(?),0dh
write db 'please write your password:',0dh,0ah,'$'
dissp2 db 'Password Right!','$'
dissp3 db 'Password Error!','$'
accuracy db '5201314',0dh ;用户输入密码,以回车键结束
count equ $-accuracy ;密码长度
seperate db 0dh,0ah,'$' ;换行
times db 4 ;用于后面错误的重新尝试机会
data ends
code segment
assume cs:code,ds:data,es:data
start: mov si,offset password ;输入的密码
mov di,offset accuracy ;正确的密码
mov ax,data
mov ds,ax
mov es,ax
mov dx,offset write ;please write your password:
mov ah,09h
int 21h
mov cx,20
mov bx,0
input: mov ah,7 ;7号中断指令,键盘输入无回显,AL=输入字符
int 21h
mov [si],al
cmp al,0dh ;判断是否输入回车键
je over ;如果输入回车键,表明用户输入结束
cmp al,08h
je delete
mov ah,2 ;如果不是回车键,则调用2号中断,显示输出,DL=输出字符
mov dl,'*'
int 21h
inc si
inc bx ;统计输入的密码数目,为删除做准备,若是删除的次数多于输入密码数目,直接退出
loop input
delete: cmp bx,00h ;若是删除的次数多于输入密码数目,直接退出
jz exit
dec bx
mov ah,3 ;获取光标位置
int 10h
mov ah,2 ;2号中断:置光标位置
sub dl,1 ;列数减1,实现光标左移
int 10h
mov ah,2 ;调用2号中断,显示空格,消除星号
mov dl,' '
int 21h
mov byte ptr [si],00h
dec si
mov ah,3 ;获取光标位置
int 10h
mov ah,2 ;2号中断:置光标位置
sub dl,1 ;列数减1,实现光标左移
int 10h
jmp input
over : mov dx,offset seperate ;换行
mov ah,9
int 21h
mov si,offset password
mov cx,count
cld
repz cmpsb
jnz error ;密码不相等,显示错误
jmp right ;密码相等,显示正确
Transferpoint:
jmp start ;因为跳转超出范围,不能一次性跳转,所以中转跳转
error: mov dx,offset dissp3 ;显示Password Error!
mov ah,09h
int 21h
mov si,offset times ;有三次重新尝试机会,若还是错误则显示错误,
mov al,[si]
dec al ;自减1
mov [si],al
cmp al,0
jne Transferpoint ;因为跳转超出范围,不能一次性跳转,所以中转跳转到start
jmp exit
right: mov dx,offset dissp2 ;显示Password Right!
mov ah,09h
int 21h
jmp exit
exit: mov ax,4c00h
int 21h
code ends
end start
效果图: