Subroutine Return

Gast #2923
Hi

Ich habe ein Problem,  mein Programm soll nach dem letzten aufruf eines 
Unterprogramms in einer Endlosschlaufe enden.  Doch es springt an den 
Anfang des Programms und die Endlosschlaufe umfasst das ganze 
Programm!!!!

Mein Programm sieht etwa so aus wie unten eingefügt:

das letzte Unterprogramm (LCD_HEX) habe ich mit dem Befehl RET 
abgeschlossen doch er springt ans rjmp main ganz am Anfang!!!!

weiss jemand was ich da falsch gemacht habe????

Vielen Dank

Izoards



.include  "8515def.inc"


    rjmp    main


.include   "definition.inc"    ;
.include  "port_init.inc"      ;
.include  "lcd_ini.inc"      ;verschiedene Include- 
Dateien
.include  "delay.inc"      ;einbinden.
.include  "control_daten_send.inc"  ;
.include  "code wandler.inc"



main:        ldi    mpr, low (RAMEND)  ;Stackpointer
        out    spl, mpr    ;ans Ende des Internaly
        ldi    mpr, high (RAMEND)  ;SRAM Speichers
        out    sph, mpr    ;setzen

        rcall     port_init  ;Port initialisierung aufrufen
        rcall    lcd_ini  ;LCD intialisierung aufrufen

        ldi    daten, 0xFC
        rcall    LCD_HEX


loop:        rjmp    loop
Gast #2924
haste das mal im simulator durchgespielt?

vielleicht ein fehler im stack? voll?  vom programm modifiziert (liegt 
ja im ram)? oder die rücksprungadresse mit push überschrieben oder mit 
pop rausgeholt???


Jonas
Gast #2925
Oh ja, ich habe mit Push und Pop gearbeitet, und wenn ich diese weglasse 
funktioniert es auch!!! Vielen Dank!!!

Doch wieso kann ich ein Register nicht mit Push speichern, ohne dass es 
die rücksprungadresse überschreibt???
das müsste doch funktionieren¨!!!????

izoard
Gast #2926
Wow ja, es liegt am Pushen und Popen!!! ohne diese Befehle funktioniert 
es nämlich!!!
Aber ich müsste doch ein Register mit dem Befehl sichern können??? Was 
habe ich da falsch gemacht??? Vielleicht sieht das jemand??? Ich poste 
hier noch mein Unterprogramm lcd_hex!!!!


LCD_HEX:                  push    daten
    ldi    zaehler, 0x02
    swap    daten
HEX_loop:  andi    daten, 0x0F
    mov    mpr, daten
    subi    mpr, 0x0A
    brsh    highsm
    ori    daten, 0x30
    rjmp    go

highsm:    subi    daten, 0x09
    ori    daten, 0x40

go:    rcall    zeichen
    dec    zaehler
    pop    daten
    cpi    zaehler, 0x00
    brne    HEX_loop
;loop2:    rjmp    loop2
    ret
Gast #2927
Ich hab's jetzt nur mal überflogen, aber du PUSHst EINMAL ganz am Anfang 
(LCD_HEX). Du POPst aber unter umständen mehrfach, da der POP-Befehl in 
einer Schleife steht. Das geht so nicht. Das was auf den Stack geht, 
muss auch wieder runter. Und zwar genau so oft, wie es rauf ging.
Gast #2928
Ah ja suuper, vielen Dank...
Ich pushe nun das Register am Anfang einfach mehrmals!!! ist 
wahrscheinlich nicht die beste Lösung, oder schon????
Gast #2929
nee, nicht wirklich.

wenn du kein register mehr frei hast, also sachen für mehrfachen zugriff 
auf dem stack ablegen musst, dann solltest du es nach dem poppen gleich 
wieder pushen.

den stack musst du dir als stapel vorstellen. du hast immer nur zugriff 
auf das oberste element. auf dem stack werden auch rücksprungadressen 
gespeichert.

wieso popst du die daten eigentlich da unten vor dem sprung? wäre nach 
dem sprung nicht gescheiter?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 24 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.