Code:
def fib(n)
if (n==0)
return 0
else
if (n==1)
return 1
else
return fib(n-1) + fib(n-2)
end
end
end
Eine in Ruby geschrieben Funktion zur Berechnung der n-ten Fibonacci-Zahl mittels Rekursion. Sehr simpel und in so gut wie allen Programmiersprachen würde das ähnlich aussehen.
Das ganze in Assembler (die Funktion sollte von C aus aufgerufen werden):
(Alles hinter ; ist ein Kommentar)
Code:
segment .text
global asm_main
asm_main:
enter 0,0
push ebx ; ebx sichern, da C erwartet dass ebx nicht veraendert wird
mov eax, [ebp+8] ; Von C uebergebenen Wert aus dem Stack lesen
push eax ; Parameter auf den Stack legen
call fib ; Fib. Zahl berechnen
add esp, 4 ; Parameter vom Stack nehmen
; Ergebnis steht in eax wie von der C-Calling Convention gefordert
pop ebx ; ebx wiederherstellen
leave
ret
; Unterprogramm zur Berechnung der Fibonacci-Zahl
fib:
mov ebx, [esp+4] ; Parameter vom Stack lesen
; Ueberpruefung ob ebx=0 oder ebx=1
cmp ebx, 0
jz fibZero
cmp ebx, 1
jz fibOne
sub ebx, 2 ; n-2 berechnen
push ebx ; n-2 auf den Stack legen
call fib ; n-2.te Fib. berechnen
add esp, 4 ; Parameter vom Stack nehmen
push eax ; Ergebnis auf dem Stack sichern
mov ebx, [esp+8] ; Parameter vom Stack lesen
sub ebx, 1 ; n-1 berechnen
push ebx ; n-1 auf den Stack legen
call fib ; n-1.te Fib. berechnen
add esp, 4
; Fib(n-1) steht in eax, Fib(n-2) steht auf dem Stack
add eax, [esp] ; Fib(n-1) + Fib(n-2) berechnen
add esp, 4 ; Fib(n-2) vom Stack nehmen
jmp fibEnd
fibZero:
mov eax, 0 ; 0.te Fibonacci-Zahl ist per Definition 0
jmp fibEnd
fibOne:
mov eax, 1 ; 1.te Fibonacci-Zahl ist per Definition 1
fibEnd:
ret
Obiger Assemblertext wurde von mir vor einem Jahr als Uni-Aufgabe geschrieben und war eine Hölle zum Debuggen.