我正在尝试编写一个简单的程序,让用户使用键盘输入的
_GetCh
功能输入密码。我使用比较函数来用星号 (*) 屏蔽用户的输入(a 到 z)。这不起作用!谁能告诉我哪一部分是错误的?
这是我的代码:
.model small
.586
.stack 100h
INCLUDE PCMAC.INC
.DATA
MSG DB 'Enter Password: $'
PWD DB 'abcd'
.CODE
PASSWORD PROC
mov ax, @DATA
mov ds, ax
mov dx, offset pwd
GetLoop:
_Begin
_PutStr msg
_GetCh noEcho
cmp al, 13
je DONE
cmp al, 'a'
jnae al, EchoIt
cmp al, 'z'
jnbe al, EchoIt
add al, '*'
EchoIt:
_PutCh al
jmp GetLoop
DONE:
_Exit 0
PASWORD ENDP
END PASSWORD
这是我需要做的:
”用汇编语言编写汇编代码以从键盘读取密码。
显示消息“输入密码:”并回显用户输入的每个字符作为星号 (*)。
如果用户键入退格字符(输入数字 8),则通过显示一个退格键、一个空格和另一个退格键来擦除最后键入的字符。您不应删除密码开头以外的内容,因此您需要记录屏幕上星号的数量。”
jnae al, EchoIt jnbe al, EchoIt
您使用什么汇编器来允许这种特殊的语法?另外,尝试使用更简单的指令形式。
jnae
与 jb
相同,更具可读性。
要将“a”到“z”的字符替换为星号,您可以使用以下命令:
; here you would insert AL in buffer
; and increment the counter
cmp al, 'a'
jb EchoIt
cmp al, 'z'
ja EchoIt
mov al, '*'
EchoIt:
_PutCh al
对于您的任务,您必须将最初输入的字符保留在缓冲区中。您还希望如何验证密码?您必须在执行此星号替换之前进行插入。
GetLoop 标签放在其他地方:
_Begin
_PutStr msg
GetLoop:
_GetCh noEcho
cmp al, 13
je DONE
cmp al, 8
jne Character
Backspace:
...
Character:
; buffer and counter++
cmp al, 'a'
jb EchoIt
cmp al, 'z'
ja EchoIt
mov al, '*'
EchoIt:
_PutCh al
jmp GetLoop
DONE: