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

