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

NASM汇编语言中键盘输入数值比较跳转失效问题咨询

解决NASM汇编中键盘输入数字比较的jz跳转问题

兄弟,我一眼就瞅出你代码里的核心问题了——你完全搞错了比较的对象!你现在是把变量的内存地址和数值去比,而不是变量里存的实际输入值,这可不就永远触发不了jz跳转嘛!

问题根源拆解

你声明的name resb 1是在内存里预留了1个字节的空间,用来存储键盘输入的字符。但你写mov rbx,name的时候,NASM会把name对应的内存起始地址(比如类似0x402000这种十六进制数)加载到rbx寄存器里,而不是把这个地址里存的输入字符读出来。这就导致你拿一个内存地址和0x31(字符'1'的ASCII码)去比较,数值完全不搭边,肯定不会相等啊!

你之前试的1、0x31、"1"都没用,就是因为从一开始就没拿到输入的那个字符值,比较的对象错了。

修正后的代码方案

要解决这个问题,你需要从name指向的内存地址里读取实际存储的字节内容,然后再和目标字符的ASCII码比较:

_checkval: ; 检查值是否在1到9之间
    movzx rbx, byte [name]  ; 把name内存中存的输入字符加载到rbx(零扩展成64位,避免高位垃圾值)
    cmp rbx, '1'            ; 直接和字符'1'比较,NASM会自动转成对应的ASCII码0x31,代码更易读
    jz _equMsg              ; 现在输入等于'1'时,就会正确触发跳转了

额外优化:判断1-9的完整逻辑

如果你要验证输入是1到9之间的数字,还可以补充范围判断,让逻辑更严谨:

_checkval:
    movzx rbx, byte [name]
    cmp rbx, '1'
    jb _invalidInput        ; 输入字符的ASCII码比'1'小,说明不是1-9的数字
    cmp rbx, '9'
    ja _invalidInput        ; 输入字符的ASCII码比'9'大,同样无效
    ; 走到这里说明输入是1-9的有效数字
    cmp rbx, '1'
    jz _equMsg              ; 单独判断是否等于'1',触发对应逻辑
    ; 其他数字的处理逻辑可以写在这里
    jmp _validInput

_equMsg:
    ; 输入等于'1'时的提示或处理代码
_validInput:
    ; 有效输入的通用处理逻辑
_invalidInput:
    ; 无效输入的提示或处理代码

内容的提问来源于stack exchange,提问作者Robert Imber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:28:10