Assembler Rekursive Fakutätsberechnung

Xeno1987

Neues Mitglied
21. Juni 2012
1
0
0
Sprachen
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

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
 
Hallo,

Ich hab ein Problem, muss schon morgen die Übung abgeben,
das sehe ich auch so :eek: ... ich fürchte das da bei dem engen Zeitplan wohl keiner mehr was retten kann. :(

Mit rekursiven (sich selbst aufrufenden) Unterprogrammen und dem sauberen Beenden (ohne am Schluß den Stack gesprengt zu haben) hab ich leider noch nicht wirklich was gemacht. Da hab ich damals schon in Pascal bei Primzahlberechnungen Probleme gehabt.

Gruß
Dino
 
Hallo Xeno,

ein paar Hinweise, die dir eventuell weiterhelfen könnten:

Im rekursiven Teil führst du eine 8bit x 8bit Multiplikation aus, das Ergebnis ist 16 bit, das HighByte in r1 verwirfst du.

"A" ist dein Ergebnis im SRAM. A hat WORD-Größe, du speicherst nur das HighByte (A+1).

Ich assembliere den Code fehlerfrei, das muss natürlich nicht heißen, dass dein Programm richtig ist :)

Am besten du inkludierst die Definitionsdatei des Mikrocontrollers (da du hier nicht viel Hardware-Module nutzt,
reicht es natürlich auch, wenn du SPL usw. im Programm selber definierst):
#include "m8def.inc"


Gruß,
Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)