汇编语言使用_GetCh实现密码星号掩码的代码纠错及功能实现
汇编密码输入程序问题排查与实现
原代码核心问题定位
- 初始化逻辑错位:
_Begin宏被放置在GetLoop循环内部,每执行一次输入循环就会重复调用初始化宏、重复打印提示文本,完全打乱正常的输入交互流程 - 跳转指令语法错误:
jnae、jnbe这类条件跳转指令仅支持单操作数(跳转目标地址),代码中在跳转指令后额外添加al寄存器作为操作数的写法不符合x86汇编语法规则,会直接引发汇编报错或逻辑跳转到错误地址 - 掩码计算逻辑错误:原代码试图将输入的小写字母替换为星号,却写成
add al, '*',该操作会将输入字符的ASCII值与星号的ASCII值做加法运算,生成完全无意义的乱码字符,无法实现掩码效果 - 缺失计数支撑逻辑:没有预留记录已输入字符数量的存储单元,无法实现退格操作时的边界判断,避免擦除操作越界到提示文本区域
- 符号拼写错误:过程结束标识写为
PASWORD ENDP,与过程开头定义的PASSWORD PROC拼写不匹配,会导致汇编阶段出现符号未定义的报错 - 无效冗余代码:程序初始化阶段写入
mov dx, offset pwd的操作后续从未被使用,属于无意义的冗余指令
功能实现规则说明
- 程序启动后首先打印固定提示文本
Enter Password: - 所有有效可打印字符输入,一律回显为
*,不显示用户原始输入的字符内容 - 退格字符(ASCII码8)处理逻辑:
- 先判断当前累计的已输入星号数量是否大于0
- 若计数大于0,依次输出「退格符、空格、退格符」的组合,擦除屏幕上的上一个星号,同时将计数减1
- 若计数已经为0,说明已退到密码输入的起始位置,不做任何擦除操作,避免光标移动到提示文本区域
- 回车键(ASCII码13)触发时直接退出密码输入流程
修正后可运行参考代码
.model small .586 .stack 100h INCLUDE PCMAC.INC .DATA MSG DB 'Enter Password: $' PWD DB 'abcd' ; 预留密码存储区域 INPUT_CNT DW 0 ; 记录已输入的有效字符数,用于退格边界判断 .CODE PASSWORD PROC mov ax, @DATA mov ds, ax ; 提示文本仅在程序启动时打印一次 _PutStr MSG GetLoop: _GetCh noEcho ; 无回显读取键盘输入 ; 处理回车键 cmp al, 13 je PWD_EXIT ; 处理退格键 cmp al, 8 je BACKSPACE_HANDLE ; 普通可打印字符:直接回显星号,计数累加 mov al, '*' _PutCh al inc INPUT_CNT jmp GetLoop BACKSPACE_HANDLE: ; 计数为0时不执行擦除,直接返回输入循环 cmp INPUT_CNT, 0 je GetLoop ; 执行擦除操作:退格-空格覆盖-退格归位 mov al, 8 _PutCh al mov al, ' ' _PutCh al mov al, 8 _PutCh al dec INPUT_CNT ; 计数减1 jmp GetLoop PWD_EXIT: _Exit 0 PASSWORD ENDP END PASSWORD
内容的提问来源于stack exchange,提问作者Linux
相关产品推荐
相关产品推荐

