在DOSbox中,编写程序可以进行密码的设置(第一次)和修改(已设置密码)。要求输入的密码用*显示。
时间: 2024-02-17 14:00:00 浏览: 87
以下是一个简单的 DOSbox 密码设置和修改程序的示例代码:
```
.MODEL SMALL
.STACK 100H
.DATA
password DB 100 DUP('$') ; 存储密码的字符串
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 询问用户是否需要设置密码
MOV AH, 09H
LEA DX, prompt1
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'y'
JE set_password
; 循环进行密码验证和修改
mov bx, 0 ; bx 用于记录输入密码的长度
password_loop:
LEA DX, prompt2
MOV AH, 09H
INT 21H
; 获取输入的密码
mov cx, 0 ; cx 用于记录星号的个数
mov bx, 0 ; bx 用于记录输入密码的长度
password_input_loop:
MOV AH, 01H
INT 21H
CMP AL, 0DH ; 回车符
JE check_password
CMP AL, 08H ; 退格符
JE backspace
CMP BX, 99 ; 最多只能输入 99 个字符
JE password_input_loop
MOV password[BX], AL
INC BX
MOV DL, '*'
MOV AH, 02H
INT 21H
INC CX
JMP password_input_loop
backspace:
CMP BX, 0 ; 不能退格了
JE password_input_loop
DEC BX
MOV DL, 08H
MOV AH, 02H
INT 21H
MOV DL, ' '
MOV AH, 02H
INT 21H
MOV DL, 08H
MOV AH, 02H
INT 21H
JMP password_input_loop
; 检查输入的密码是否正确
check_password:
MOV password[BX], '$' ; 在字符串末尾加上结束符
MOV SI, 0 ; 用 SI 遍历输入的密码
MOV DI, offset password ; 用 DI 遍历存储的密码
mov dx, 0 ; dx 用于记录输入密码的长度
check_loop:
MOV AL, [SI]
CMP AL, '$'
JE password_wrong
CMP AL, [DI]
JNE password_wrong
INC SI
INC DI
INC DX
JMP check_loop
password_correct:
LEA DX, prompt3
MOV AH, 09H
INT 21H
; 询问用户是否需要修改密码
MOV AH, 01H
INT 21H
CMP AL, 'y'
JE set_password
JMP password_loop
password_wrong:
LEA DX, prompt4
MOV AH, 09H
INT 21H
JMP password_loop
; 设置密码
set_password:
LEA DX, prompt5
MOV AH, 09H
INT 21H
; 获取输入的密码
mov cx, 0 ; cx 用于记录星号的个数
mov bx, 0 ; bx 用于记录输入密码的长度
password_input_loop2:
MOV AH, 01H
INT 21H
CMP AL, 0DH ; 回车符
JE password_set
CMP AL, 08H ; 退格符
JE backspace2
CMP BX, 99 ; 最多只能输入 99 个字符
JE password_input_loop2
MOV password[BX], AL
INC BX
MOV DL, '*'
MOV AH, 02H
INT 21H
INC CX
JMP password_input_loop2
backspace2:
CMP BX, 0 ; 不能退格了
JE password_input_loop2
DEC BX
MOV DL, 08H
MOV AH, 02H
INT 21H
MOV DL, ' '
MOV AH, 02H
INT 21H
MOV DL, 08H
MOV AH, 02H
INT 21H
JMP password_input_loop2
password_set:
MOV password[BX], '$' ; 在字符串末尾加上结束符
LEA DX, prompt6
MOV AH, 09H
INT 21H
JMP password_loop
MAIN ENDP
; 提示信息
prompt1 DB '是否需要设置密码?(y/n)$'
prompt2 DB 0DH, 0AH, '请输入密码:$'
prompt3 DB 0DH, 0AH, '密码正确!$'
prompt4 DB 0DH, 0AH, '密码错误,请重新输入!$'
prompt5 DB 0DH, 0AH, '请设置密码:$'
prompt6 DB 0DH, 0AH, '密码设置成功!$'
END MAIN
```
这个程序的流程和 C# 版本类似,首先询问用户是否需要设置密码,如果需要则调用 `set_password` 标签设置密码。然后进入一个无限循环,每次循环都要求用户输入密码,并使用 `get_password` 标签获取输入的密码,密码用 * 代替显示。如果输入的密码正确,则询问用户是否需要修改密码,如果需要则调用 `set_password` 标签修改密码。如果输入的密码不正确,则提示用户重新输入密码。
阅读全文