Hallo,
Ich hab ein Problem, muss schon morgen die Übung abgeben, also ich verwende AVR-STudio 4.19 und den HATmega16.
Ich hab so meine Probleme mit Rekursion in Assembler
Aufgabenstellung:
Schreiben Sie ein Unterprogramm das die Fakultät für n<=8 berechnet.
Eingabe: 8bit und Ausgabe: 16 bit
PROCEDURE fakultaet_rekursiv(n:BYTE) : WORD;
BEGIN
IF(n<=1) return 1;
ELSE return n*fak(n-1);
END;
So hier nun mein Ansatz: krieg am ende noch eine warnung invalid OPcode0xffff at 0x001500
Ich hab ein Problem, muss schon morgen die Übung abgeben, also ich verwende AVR-STudio 4.19 und den HATmega16.
Ich hab so meine Probleme mit Rekursion in Assembler
Aufgabenstellung:
Schreiben Sie ein Unterprogramm das die Fakultät für n<=8 berechnet.
Eingabe: 8bit und Ausgabe: 16 bit
PROCEDURE fakultaet_rekursiv(n:BYTE) : WORD;
BEGIN
IF(n<=1) return 1;
ELSE return n*fak(n-1);
END;
So hier nun mein Ansatz: krieg am ende noch eine warnung invalid OPcode0xffff at 0x001500
Code:
; Rekursive Fakultaetsberechnung
;REGISTER DEFINITIONS
.def INPUT = R16 ;Eingabe
.def OUTPUT= R17 ;Ausgabe
.def TMP= R18 ;Temporaere Varaible fuer SP
;MEMORY and I/O ADRESSES
.equ RAMEND = $45F ;hoechste RAM Adresse
.equ SPH = $5E ;SP Adresse high
.equ SPL = $5D ;SP Adresse low
;CONSTANTS
.equ N = 3 ;Eingabe von n zwischen [0;8]
.DSEG ;Datensegment
.ORG $0060 ;Start Adresse Datenspeicher
E: .BYTE 1 ;8 Bit fuer Eingabe von n
A: .BYTE 2 ;16 Bit fuer Ausgabe
.CSEG ;Code Segment
.ORG $0000 ;Start Adresse Programmspeicher
;MAIN PROGRAM
INIT: LDI TMP,high(RAMEND)
STS SPH,TMP ;Initialisierung des StackPointer
LDI TMP,low(RAMEND)
STS SPL,TMP ;RAM Ende
START:LDI INPUT,N ;Setze die Eingabe
CALL FAK1 ;rufe fakultaet_rekursiv
JMP START ;wieder von vorne
;SUBROUTINE FAK1
;Computes n*fak(n-1)
.def CNT = R19 ;Counter
FAK1: PUSH CNT ;Speicher R19 auf Stack
MOV CNT,INPUT ;Eingabewert nach Counter schieben
LOOP: CPI CNT,1 ;N<=1?
BREQ CAS1 ;Wenn kleiner,gleich dann return 1
DEC CNT ;n-1
MUL INPUT,CNT ;n*fak(n-1)
MOV INPUT,R0 ;schiebe ergebnis von r0 nach Input
CPI CNT,2 ;else n>1
CALL LOOP ;Wenn n>1 rekursiver aufruf
CAS1: LDI CNT,1 ;Ausgabe register = 1
STS A+1,INPUT ;Speichere ergebnis nach Ausgabe
POP CNT ;Speicher R19 wiederherstellen
RET ;zurueck wenn fertig