Hallo,

ich habe folgendes Problem und zwar sollen wir die Fibonacci-Zahlen in Assembler programmieren.
Da wir kaum Unterlagen oder sonstige Hilfe bereitgestellt bekommen haben, wurden wir quasi ins kalte Wasser geschmissen.
Genau deshalb schreibe ich nun diesen Eintrag, in der Hoffnung das mir jemand helfen kann.

Aufgabe:
In dieser Aufgabe soll ein iterativer Algorithmus zur Berechnung der Fibonacci-Zahlen auf einem ATMega16 implementiert werden. Fibonacci-Zahlen bilden eine unendliche Folge, für die gilt:
F(0) = 0, F(1) = 1, F(k) = F(k-1) + F(k-2) Für alle k Elemente aus den natürlichen Zahlen und k>=2
Schreiben Sie ein Assemblerprogramm, das iterativ die Fibonacci-Zahl F(k) entsprechend der gegebenen Bildungsvorschrift berechnet.

(a) Anlegen eines Projektes und Initialisierungen
Beginnen Sie mit einem neuen Atmel Studio Projekt. Wählen Sie als Programmiersprache Assembler, als Mikrocontroller einen ATmega16 und als Debug-Tool den Simulator aus. Folgende Registerbezeichnungen sind gegeben Tmp=R16, K=R19 und Result=R20. Definieren Sie diese und alle weiteren verwendeten Registerbezeichnungen.
(b) Implementierung des Hauptprogramms
Implementieren Sie das Hauptprogramm main. Belegen Sie hier das Register K als Eingabe für die Berechnung von F(k) mit einem konstanten Wert und führen Sie anschließend die Berechnung der Fibonacci-Zahlen durch. Das Ergebnis F(k) soll sich nach der Berechnung im Register Result befinden und der ATmega in einer Endlossschleife verharren.

Folgenden Code habe ich schon:
;-----------------------------------------------------------------------------
; Einbinden der controllerspezifischen Definitionsdatei
;-----------------------------------------------------------------------------
.NOLIST ; List-Output ausschalten
.INCLUDE "m16def.inc" ; Deklarationen für Mega16 einfügen
.LIST ; List-Output wieder einschalten
;------------------------------------------------------------------------------
; Programmspeicher (FLASH) Programmstart nach RESET ab Adr. 0x0000
;------------------------------------------------------------------------------
.CSEG ; Programmbereich im Flash
.ORG 0x0000 ; Programm beginnt an der FLASH-Adresse 0x0000
RESET: RJMP INIT ; Springe nach INIT (Ueberspringe ISR Vektoren)
;------------------------------------------------------------------------------
; Initialisierungen und eigene Definitionen
;------------------------------------------------------------------------------
.ORG INT_VECTORS_SIZE ; Platz fuer ISR Vektoren lassen
INIT: .DEF Tmp = R16
.DEF K = R19
.DEF Result = R20
.EQU Takt = 1000000

CLR Tmp ; Initialisiere Tmp mit 0
CLR K ; Initialisiere K mit 0
CLR Result ; Initialisiere Result mit 0

; Stapel initialisieren
LDI Tmp, HIGH(RAMEND) ; RAMEND (SRAM) ist in der Definitionsdatei
OUT SPH, Tmp ; festgelegt
LDI Tmp, LOW(RAMEND)
OUT SPL, Tmp


;------------------------------------------------------------------------------
; Hauptprogramm
;------------------------------------------------------------------------------
MAIN:


RJMP MAIN ; Endlosschleife
END: RJMP END ; Endlosschleife
.EXIT ; Ende des Quelltextes