首页 > 解决方案 > 如何使用星号来屏蔽密码?

问题描述

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

标签: assemblyx86-16

解决方案


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:

推荐阅读