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

汇编语言实现用户ID校验报错求助:合法输入仍提示无效

问题排查与修复

几个关键错误导致输入判断失效

  • 未定义输入缓冲区id:.data段里根本没声明存储ID的缓冲区,ReadString会往非法内存地址写入数据,后续的长度判断完全失效。
  • 错误获取输入长度:ReadString执行完毕后,输入字符串的长度是存在eax寄存器中的,你现在的代码把输入的第一个字符的ASCII值当成了长度——比如输入123helo,第一个字符'1'的ASCII是49,49大于30,直接触发无效提示。
  • newline变量未定义:代码里调用WriteString输出换行,但.data段没有定义该变量,运行时会出现输出乱码或报错。
  • 多余的手动添加终止符:ReadString会自动在输入字符串末尾添加null终止符,不需要手动执行mov byte ptr [id + ebx], 0,这步操作反而可能破坏正常数据。

修正后的完整代码

INCLUDE Irvine32.inc 

.data
newline BYTE 0Dh, 0Ah, 0  ; 定义换行符
IDprompt BYTE "Enter ID: ",0
InvalidId BYTE "ID you entered is not valid ",0
id BYTE 31 DUP(0)         ; 31字节缓冲区:30个有效字符+自动添加的终止符

.code 
Main Proc 
call ID_check

exitProgram:
exit 
Main ENDP

ID_check PROC
    mov edx, OFFSET newline
    call WriteString 
    mov edx, OFFSET IDprompt   ; 显示输入提示
    call WriteString
    
    mov edx, OFFSET id         ; 指定输入缓冲区地址
    mov ecx, SIZEOF id         ; 缓冲区大小(31字节)
    call ReadString 
             
    cmp eax, 0                 ; 检查是否为空输入
    je  ID_check               ; 空输入则重新提示
    
    cmp eax, 1    ; 长度小于1则判定无效
    jl id_invalid
    cmp eax, 30   ; 长度大于30则判定无效
    jg  id_invalid 
            
    ret

id_invalid:
    mov edx, OFFSET newline
    call WriteString 
    mov edx, OFFSET InvalidId
    call WriteString
    jmp ID_check

ID_check  ENDP

END Main 

修复说明

  1. 在.data段添加了id缓冲区,大小为31字节,刚好容纳30个有效字符加ReadString自动添加的null终止符。
  2. 改用ReadString返回的eax寄存器获取输入长度,这是Irvine32库的标准用法。
  3. 定义了newline变量,实现正常的换行输出效果。
  4. 删除了多余的手动添加终止符代码,避免干扰ReadString的自动处理逻辑。

内容的提问来源于stack exchange,提问作者Pukka Raz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:18