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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:09:24