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

NASM x86汇编中printf循环仅打印数组首个元素问题排查

问题分析与修复

问题1:仅输出第一个元素就停止

你的代码在第一次调用printf后直接执行了call exit,这条指令会直接终止程序,inc esi、cmp esi,4这些循环逻辑根本没机会运行,自然只能输出数组的第一个元素。

问题2:移除call exit后无限打印首个元素

printf遵循cdecl调用约定,调用者需要负责清理栈上的参数。你调用printf前push了两个参数:fmt(4字节)和ecx(4字节),总共8字节,但你只用pop ecx回收了4字节,栈没有平衡。这会导致后续的inc esi等指令执行时,栈指针位置错误,程序流程混乱,esi始终无法正确递增,所以会无限打印第一个元素。

修复后的代码

extern printf
extern exit
section .data
    array db 1,2,3,4
    fmt  db "%d" , 0xa, 0
section .text
global main

main:
    mov     esi, 0
    jmp     loopfun

loopfun:
    mov     ecx, 0
    mov     cl, [array + esi]
    push    ecx
    push    fmt
    call    printf
    add     esp, 8          ; 清理printf的两个参数,恢复栈平衡
    inc     esi
    cmp     esi, 4
    jne     loopfun

    ; 程序正常退出
    mov     eax, 1
    mov     ebx, 0
    int     0x80  

关键修改说明

  • 删除call exit,让循环逻辑能正常执行
  • 用add esp, 8替代pop ecx,正确清理printf的两个参数,保证栈平衡,后续指令能正确执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:54:49