x86_64架构Mac系统下nasm汇编输入与字符比较不生效问题
问题核心原因
- 你当前的比较逻辑是对比两个内存地址的数值,而非地址中存储的字符内容:
mov rax, r是将标签r对应的内存地址赋值给rax,mov rbx, input是将输入缓冲区input的内存地址赋值给rbx,两个地址分属不同段(.data和.bss)天然不相等,所以je永远不会触发。 - 单字符比较不需要用64位寄存器操作,你要匹配的是单个ASCII字符,只需要对比1字节的内存值即可。
- 额外注意:你定义的
r存储的是'r' + 换行符两个字节,而标准输入读取时,输入r后按回车,实际读取的内容也是'r' + '\n',如果只需要匹配输入的第一个字符是r,可以忽略换行符的比较。 - 原代码中用
ret作为分支标签名不规范,ret是x86架构的子程序返回指令,容易引发歧义,建议改为exit这类无歧义名称。
修正代码示例
global start section .bss input resb 10 section .text start: ; 读取输入 mov rax, 0x2000003 ; macOS read系统调用号 mov rdi, 0 ; stdin文件描述符 mov rsi, input mov rdx, 10 syscall ; 修正后的比较逻辑:取地址指向的内容对比 mov al, [input] ; 取input地址的第一个字节存入8位寄存器al mov bl, [r] ; 取r地址的第一个字节存入8位寄存器bl cmp al, bl je right jmp exit right: mov rax, 0x2000004 ; macOS write系统调用号 mov rdi, 1 ; stdout文件描述符 mov rsi, right_way mov rdx, right_len syscall exit: mov rax, 0x2000001 ; macOS exit系统调用号 xor rdi, rdi syscall section .data right_way: db "You are correct!", 10 right_len: equ $-right_way r: db "r"
额外说明
如果需要完整匹配输入内容和r加换行的组合,可增加第二字节的比较逻辑:先判断[input]等于'r',再判断[input+1]等于10(换行符的ASCII值),两个条件都满足再跳转即可。
核心规则:x86汇编中,标签加[]才代表取地址对应内存中的内容,不加[]仅代表地址本身的数值。
内容的提问来源于stack exchange,提问作者Yoffdan
相关产品推荐
相关产品推荐

