2014-11-06 46 views
0

调用printf向控制台显示状态消息时,会输出两次。不知道为什么。我期望我的输出是:从程序集调用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 

回答

6

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

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