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.


Log in to reply