NASM输入验证问题:有效整数被误判为无效
解决NASM整数范围验证的问题
嘿,刚入门汇编就能动手写NASM程序真的超棒!你的问题核心其实很明确——你现在直接拿读取的字符串和数值做比较,这完全行不通,咱们一步步拆解清楚:
问题根源:你读取的是ASCII字符串,不是二进制整数
当你用sys_read读取用户输入的"10"时,存在value缓冲区里的是ASCII字符'1'(十六进制0x31)和'0'(0x30),而不是数值10的二进制表示(0x0A)。直接把这个字符串和数值100000做比较,本质是在对比ASCII码的数值,结果肯定和你预期的完全不符,这就是为什么有效输入也会触发invalidInput的原因。
必须做的关键步骤:字符串转整数
要正确验证范围,你得先把用户输入的ASCII字符串转换成二进制整数,再做数值比较。这里给你一个简单的字符串转整数的NASM实现:
; 功能:将ASCII字符串转换为32位整数 ; 输入:esi指向字符串起始地址(字符串以非数字字符结尾,比如换行符) ; 输出:eax存储转换后的整数 str_to_int: xor eax, eax ; 初始化结果为0 .next_digit: movzx ecx, byte [esi] ; 读取一个字符,零扩展到ecx cmp ecx, '0' jb .done ; 遇到非数字字符,结束转换 cmp ecx, '9' ja .done sub ecx, '0' ; 将ASCII字符转为对应数字 imul eax, 10 ; 结果乘以10,准备累加下一位 add eax, ecx ; 累加当前数字 inc esi ; 指针移动到下一个字符 jmp .next_digit .done: ret
修正后的比较逻辑
转换完成后,你就可以用标准的数值比较指令来验证范围了:
; 假设转换后的整数存在eax中 cmp eax, 0 jl invalidInput ; 小于0,无效 cmp eax, 100000 jg invalidInput ; 大于100000,无效 ; 到这里说明输入有效,继续后续逻辑
额外注意点
- 你的
value缓冲区只分配了4个字节,但100000是6位数字,加上可能的换行符,至少要分配7个字节(resb 7),避免缓冲区溢出。 - 读取输入时,要注意处理换行符,确保字符串转整数的函数能正确识别结束位置。
慢慢来,汇编入门确实要踩这些基础坑,多试几次就熟练啦!
内容的提问来源于stack exchange,提问作者1221312
相关产品推荐
相关产品推荐

