如何使用星号屏蔽密码?

时间:2021-04-20 13:58:44

标签: assembly x86-16

我尝试编写一个简单的程序让用户使用_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

1 个答案:

答案 0 :(得分:0)

<块引用>
jnae al, EchoIt
jnbe al, EchoIt

你正在使用什么汇编程序来允许这种特殊的语法?此外,尝试使用更简单的指令形式。 jnaejb 相同,后者更具可读性。

要用星号替换从 '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: