You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言使用_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 09:06:00