汇编语言实现用户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
修复说明
- 在
.data段添加了id缓冲区,大小为31字节,刚好容纳30个有效字符加ReadString自动添加的null终止符。 - 改用
ReadString返回的eax寄存器获取输入长度,这是Irvine32库的标准用法。 - 定义了
newline变量,实现正常的换行输出效果。 - 删除了多余的手动添加终止符代码,避免干扰
ReadString的自动处理逻辑。
内容的提问来源于stack exchange,提问作者Pukka Raz
相关产品推荐
相关产品推荐

