Stackpointer, Rekursion und JNE => Segmentation fault
-
Guten Abend,
ich habe mir heute mal ein wenig Assembler angeschaut (bin primär C-Programmierer). Ausgesucht habe ich mir NASM unter Linux.
Als kleine Einstiegsaufgabe will ich einen Integer rückwerts ausgeben. Mein Code sieht so aus:
section .data character: db 0 section .text global _start _start: mov eax, 23 ; put parameter on stack push eax call print ; call print function add esp, 4 ; remove parameter from stack mov eax, 1 ; exit system call mov ebx, 0 ; return code=0 int 80h print: push ebp ; push ebp so that we can pop its previous value before returning mov ebp, esp ; copy esp so that we can use ebp as basepointer mov eax, [ebp+8] ; access parameter mov ebx, 10 ; set divisor (=10) xor edx, edx div ebx push eax ; eax=result of the division push edx ; edx=remainder call print_number ; call print function add esp, 4 ; remove parameter from stack cmp eax, 0 jne print_number add esp, 4 ; remove parameter from stack pop ebp ; pop previous value of ebp ret print_number: push ebp ; push & copy ebp mov ebp, esp mov eax, [ebp+8] ; access parameter add eax, 48 ; convert parameter to ascii mov [character], eax ; [character]=eax mov eax, 4 ; write system call mov ebx, 1 ; file descriptor: stdout mov ecx, character ; pointer to [character] mov edx, 1 ; length of the text to print int 80h pop ebp ret
Ich schreibe also zu Beginn die 23 auf den Stack und rufe die print-Funktion auf. Die holt sich den Paramter und dividiert die Zahl durch 10. Der Rest wird mit der Funktion print_number ausgegeben (welche den Zahlenwert nach ASCII kodiert).
Die Funktion print soll sich selbst aufrufen, wenn der Vorkommateil der Division ungleich 0 ist. Hier liegt das Problem: der Aufruf schlägt fehlt. Lasse ich den Vergleich bleiben (jne print_number), funktioniert alles einwandfrei - der jne-Aufruf zerhaut mir also vermutlich den Stackpointer.
Hat jemand vielleicht einen Tipp, woran das liegt?
Gruß,
Lord Kefir
-
Ist klar. Wenn du per jne in die print_number-funktion springst, ist der Wert, den ret vom Stack holt, das in Zeile 25 gepushte eax => ab ins Nirvana => SegFault.