An "Unterprogramm" Parameter übergeben (Assembler)

Gast #56885
Hi,

mit Unterprogramm meine ich z.B.:

UART_Ausgabe:
...
ret

Nun möchte ich an dieses "Unterprogramm" Parameter übergeben. Im
Moment mache ich dies mit festen Stellen im SRAM und eben per LDS bzw.
STS.

Nun war meine Idee das ganze per PUSH und POP zu machen. Wenn ich's
recht verstanden habe, geht das aber nicht. Denn wenn ich im
"Unterprogramm" POP sage, bekomme ich ja die Rücksprung-Adresse,
richtig?!?

Wie kann man sonst noch Parameter geschickt und schnell übergeben?

Per festem Register-Befehl geht auch nicht, da ich die Register von
R16-R31 im Unterprogramm direkt brauche und die restlichen Register nur
über Umwege und nicht über ldi beschrieben werden können.

Danke schonmal!

Sebastian
Gast
So sinnlos kann das mit dem übergeben der Parameter per Push und Pop
nicht sein, besonders wenn die Register belegt sind oder nicht
ausreichen.

Dass du die betreffenden Parameter nicht mit Pop bekommst ist richtig,
du kannst sie aber mit push auf den Stack legen und dann in deinem
Unterprogramm mit:
IN  ZL, SP
SUBI  ZL, (-5)
lesen. Dabei musst du die -5 natürlich evtl. anpassen.

Der Vorteil ist einfach, das das Programm universeller wird.
Nach der Routine nicht vergessen die Daten wieder vom Stack zu löschen,
sonst läufter der irgendwann über.

MfG Mike
"Wie kann man sonst noch Parameter geschickt und schnell übergeben?"


Viele Wege führen nach ROM:


Von Push würde ich abraten, da man zu sehr aufpassen muß, daß der Stack
immer ausbalanciert ist.

Außerdem ist doch "ldi r16, 1"+"mov r2,16" schneller als "ldi r16,
1"+"push r16".


Du kannst aber auch die Register erst innerhalb der Funktion pushen,
wenn Du sie brauchst. Wenn die Funktion öfter aufgerufen wird, ist das
sogar effektiver.


Schließlich kannst Du konstante Parameter einfach hinter den Aufruf
plazieren ".db xxx"und dann per "lpm" auslesen. Mit "ijmp"
springt man dann dahinter zurück. Das wird z.B. gerne gemacht, um Texte
auszugeben, in AVRFReaks ist dazu eine Designnote.


Dann kannst Du auch einen Pointer als Parameterstack reservieren und
mit "st X+, r16" und "ld r16, -X" die Parameter reinladen bzw.
abholen.



Peter
Gast
Hi,

danke erstmal für alle Antworten! :-)

Ich stell' gerade fest, daß sowohl PUSH als auch POP ja je 2
Taktzyklen brauchen. LDI und MOV brauchen jeweils 1 Taktzyklus, also
gibt sich das ganze ja dann die Hand.

Ich werde die Register r2 bis r15 als generelle Übergabe-Parameter
verwenden, r0 und r1 brauche ich schon für MUL.

Vielen Dank nochmals für die tollen Ideen! :-)

Sebastian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.