Problem in Assembler

die_3_von_der_tanke
Gesucht ist ein rekursives Programm das die Fibonacci-Zahl zu einem gegebenen n berechnet.
Dazu soll n von der Tastatur eingelesen, wobei nur die Ziffern 0 bis 9 als Eingabe zugelassen sind (Nützliche DOS-Interrupts:
Zeichen ohne Ausgabe einlesen über int 21h mit ah = 08h und Rückgabe in al; Zeichen ausgeben
mit ah = 02h und Zeichen in dl sowie int 21h).
Die Definition der Fibonacci-Zahlen lautet folgendermaßen: fib(n) = fib(n - 1)+fib(n - 2); fib(0) = 0; fib(1) = 1.
Zum Schluss soll die Fibonacci-Zahl auf dem Bildschirm ausgegeben werden.

Bitte helft uns!!!
FrankN
Hey... da drückt sich jemand vor den Hausaugaben! großes Grinsen
Hunter
Ja, und wie smile

Also Assembler wird sicher net im normalen Infounterricht mit diesem Schwierigkeitsgrad behandelt, ergo haben sich die 3 das sicher selbst ausgesucht.

Von daher... liefert uns mal euren Quelltext und dann die Frage zu dem Problem was ihr damit habt.
taiju
Liefert mal euren code oder zumindest pseudocode, dann helfen wir euch weiter falls es probs gibt.

Also ich weis nicht wie das so in good old germany ist aber wir hier in Österreich, zumindest der Elektrozweig meiner HTL, macht assembler ziemlich genau also könnten es ja doh Hausaufgaben sein 0)

Zitat:
mit diesem Schwierigkeitsgrad behandelt


hmm.. die fibonacci zahlen und ein Schwierigkeitsgrad ?? ^^

greetz
tAiJu
AlienBuster
Hohoho
so siehts aus:

stapel segment stack 'stack'
db 100 dup(?)
stapel ends

daten segment
frage db "Bitte Zahl eingeben: ",'$'
erg db "Fibonacci-Zahl = ",'$'
daten ends

code segment
assume cs:code, ds:daten, ss:stapel

fibo proc near ;Berechnet rekursiv Fibonacci-Zahl
;Erhält Zahl vom Stack
;Rückgabe auf Stack
push bp ;Verwende bp zur Adressierung
mov bp, sp
push ax ;Register ax retten
mov ax, [bp+04h] ;Parameter n nach ax
cmp ax, 1 ;Überprüfen auf Rekursionsabbruch
jle ende ;n <= 1?
dec ax
push ax
call fibo ;fibo(n-1) berechnen
dec ax
push ax
call fibo ;fibo(n-2) berechnen
pop ax
pop bx
add ax, bx ;fibo(n-1) + fibo(n-2)
mov [bp+04h], ax ;Ergebnis zur auf Stack
ende:
pop ax ;ax wiederherstellen
mov sp, bp
pop bp
ret
fibo endp

b2a proc near ;Konvertiert Zahl in ASCII-Darstellung
;Parameter auf dem Stack
push bp
mov bp,sp ;Verwende bp zur Adressierung des Stack

mov ax,[bp+04h]
mov cx,0
mov bx,10
convert:
mov dx, 0
div bx ;fortgesetzte Division durch 10
push dx ;Retten des Restes
inc cx ;Anzahl der Reste zählen
cmp ax, 0 ;Ergebnis = 0?
jnz convert
mov ah, 9 ;Stringausgabe vorbereiten
mov dx, offset erg ;Anfangsadresse von erg übergeben
int 21h ;Ausgabe
output:
pop dx ;Reste in umgekehrter Reihenfolge
add dl, 30h ;ausgeben
mov ah, 2
int 21h
loop output

mov sp, bp
pop bp
ret 2 ;Stack freigeben und zurück
b2a endp

start:
mov ax,daten
mov ds,ax

mov ah, 09h ;Ausgabe vorbereiten
mov dx, offset frage
int 21h
eingabe:
mov ah, 08h ;Zeichen einlesen ohne Echo
int 21h
cmp al, '0' ;Überprüfen ob
jl eingabe ;<0
cmp al, '9' ;oder
jg eingabe ;>9
;wenn ja, dann Eingabe nochmal
mov bl, al ;sonst, Eingabe in bl retten
mov ah, 02h ;und auf Bildschirm ausgeben
mov dl, al
int 21h
mov dl, 10
int 21h
mov dl, 13
int 21h ;Zeilenwechsel ausgeben

sub bl, '0' ;Subtrahieren von '0'
xor bh, bh ;in bx befindet sich jetzt n
push bx
call fibo ;fibo mit n aufrufen
;pop dx ;Ergebnis holen
;push dx ;und gleichwieder zurückschreiben
call b2a ;Ausgabe

mov ax, 4c00h ;Zurück zu DOS
int 21h
code ends
end start

das müsste reichen ;D

MfG
Hunter
Hallo taiju,

die Aufgabe war doch:

Zitat:
Gesucht ist ein rekursives Programm das die Fibonacci-Zahl zu einem gegebenen n berechnet.


Das hat in meiner Klasse schon den Hauptteil in C zum verzweifeln gebracht... und da gings nur um Quicksort - aber die Rekursion war wahrsch. eher der Knackpunkt.