从程序集调用printf时,字符串输出两次

时间:2014-11-06 21:32:45

标签: c assembly x86 nasm

当调用printf向控制台显示状态消息时,它会输出两次。不知道为什么。我希望我的输出是:

Generating move list file...
Done

但我得到了:

Generating move list file...
Done
Done

由于某种原因,我得到了重复的“完成”。

[SECTION .data]
GenMsg:     db "Generating move list file...",10
DoneMsg:    db "Done",10

extern printf

[SECTION .bss]

[SECTION .text]
global main

main:
push ebp            ; set up stack frame
mov ebp,esp
push ebx            ; save regs
push esi
push edi

push GenMsg         ; push addr of gen msg on stack
call printf         ; display gen msg
add esp,4           ; clean up stack 1 parm * 4 = 4 bytes

push DoneMsg        ; push addr of done msg on stack
call printf         ; display done msg
add esp,4           ; clean up stack 1 parm * 4 = 4 bytes

exit:
pop edi             ; restore regs
pop esi
pop ebx
mov esp,ebp         ; destroy stack frame
pop ebp
ret

1 个答案:

答案 0 :(得分:6)

您的字符串不正确null-terminated。那么当你打印GenMsg时会发生什么,你的两个字符串都会被打印出来。然后打印DoneMsg并获取第二个"Done" 您需要在每个字符串后添加一个值为0的字节:

GenMsg:     db "Generating move list file...",10,0
DoneMsg:    db "Done",10,0