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

x86汇编程序编译正常但无控制台输出问题排查

问题分析与修复

核心问题:64位Linux系统调用号错误

你编写的是64位x86汇编程序(使用了rax、rdi等64位寄存器),但误用了32位Linux的系统调用号:

  • 32位下write系统调用号是4,而64位Linux中write的系统调用号是1
  • 错误的调用号会导致syscall执行的不是预期的写操作,因此控制台无输出

次要问题:循环逻辑遗漏0的输出

你的循环判断cmp byte [count], 0; jg decr_loop表示当count大于0时才跳转循环,这会导致count减到0时不再进入循环,0不会被输出,不符合你“输出9到0”的预期,需要改成jge(大于等于0时跳转)。

修正后的代码

; ------------------------------------------------------------------------------
        global    _start
; ------------------------------------------------------------------------------
        section   .text     ; Start of our code

_start:
    mov byte [count], 9
decr_loop:
    ;; Print current count value
    mov rax, 1      ; 64位Linux系统调用号:write
    mov rdi, 1      ; 文件描述符:stdout
    mov rsi, count  ; 要输出的变量地址
    mov rdx, 1      ; 输出字节数
    syscall         ; 调用内核

    ;; Print newline character
    mov rax, 1      ; 64位Linux系统调用号:write
    mov rdi, 1      ; 文件描述符:stdout
    mov rsi, newline; 换行符地址
    mov rdx, 1      ; 输出字节数
    syscall         ; 调用内核

    ;; Decrease the count
    dec byte [count]

    ;; Compare count to zero. Jump if greater or equal
    cmp byte [count], 0
    jge decr_loop   ; 大于等于0时继续循环,确保0被输出

    ;; Exit program
    mov rax, 60     ; 64位Linux系统调用号:exit
    xor rdi, rdi    ; 退出码0
    syscall         ; 调用内核
; ------------------------------------------------------------------------------
        section   .data
newline:
    db 10           ; 换行符ASCII码
count:
    db 9            ; 初始化count为9
; ------------------------------------------------------------------------------

验证方法

编译运行:

nasm -f elf64 myprogram.asm -o myprogram.o
ld myprogram.o -o myprogram
./myprogram

此时会逐行输出9、8、7……1、0,符合预期。

内容的提问来源于stack exchange,提问作者Osasikemwen Ogieva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:20:43