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
相关产品推荐
相关产品推荐

