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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:39:04