【问题标题】:How can I use asterisk to mask the password?如何使用星号来屏蔽密码?
【发布时间】:2021-04-20 13:58:44
【问题描述】:

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

【问题讨论】:

  • 这不可能是你的整个程序,因为它缺少数据部分和宏定义。无论如何,您不应该在: 之后为GetDec 提供一些东西吗?例如。 EXTRN GetDec:PROC.
  • csee.umbc.edu/courses/undergraduate/CMSC211/fall01/burt/… 是您正在使用的PCMAC.INC 文件吗?
  • “它不起作用”没有多大帮助。你可以说得更详细点吗?它有什么作用,而您希望它做什么?你试图调查什么 - 例如。使用调试器单步执行?如果没有,是什么阻止了你?
  • add al, '*' 似乎不太可能是您想要的,因为它会将 ASCII 代码添加在一起。例如,如果用户键入j(ASCII 152),它会添加*(ASCII 42),并输出代码为152+42=194的字符,这是一些扩展图形字符。你可能只是想写mov al, '*' 来打印一个星号而不是原来的字符?
  • 这是我需要做的“用汇编语言编写汇编代码以从键盘读取密码。显示消息“输入密码:”并将用户键入的每个字符回显为星号( *). 如果用户输入了一个退格字符(输入数字 8),通过显示一个退格符来擦除最后一个输入的字符。一个空格和另一个退格符。您不应该擦除超出密码开头的字符,因此您需要计算屏幕上的星号。”

标签: assembly x86-16


【解决方案1】:
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:

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2016-01-21
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多