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 freimachen

    so 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"


Anmelden zum Antworten