printf erzeugt Endlosschleife
-
Hallo zusammen,
ich stehe gerade ziemlich auf dem Schlauch. Ich möchte in einer Schleife einfach die Zahl 1 zehnmal ausgeben. Ich habe den folgenden Code geschrieben:
out: .string "%d" movl $0, %ecx .OUTPUT: cmpl $10, %ecx #Schleifenkopf je .FIN #Falls Zählvariable %eax == 10 ist -> aufhören pushl %ecx #sonst ausgeben der Zahl pushl $out call printf addl $8, %esp #Stack wieder freimachen addl $1, %ecx #Zählvariable um 1 erhöhen jmp .OUTPUT #nächster Schleifendurchlauf .FIN: ...
Leider erzeugt dieser Code eine Endlosschleife bei mir, die irgendwelche Speicheradressen ausgibt. Warum? Kommentiere ich diese Zeilen aus:
pushl %ecx #sonst ausgeben der Zahl
pushl $out
call printf
addl $8, %esp #Stack wieder freimachenso ist die Endlosschleife verschwunden.
Was mache ich falsch?
Vielen Dank
LG, freakC++
-
edit: Im Debugger sehe ich, dass "call printf" das %ecx auf irgendeinen komischen Wert setzt. Daher kommt die Endlosschleife zustande. Warum macht printf das? Wie kann ich das verhindern? Danke!
edit2: Ich habe das Problem gelöst, indem ich %ecx einfach vom Stack wieder lese. Aber warum macht printf das?
-
http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
ecx muss man caller gespeichert werden.
cdecl ist eine ziemlich anstrengende Aufrufkonvention für Assembler - weil der caller immer alles aufräumen muss.
-
freakC++ schrieb:
Warum macht printf das? Wie kann ich das verhindern?
http://www.agner.org/optimize/calling_conventions.pdf
Kapitel "Register usage"