Forum: Mikrocontroller und Digitale Elektronik Parameter in Assemler


von Guest33 (Gast)


Lesenswert?

Hallo Jungs,

ich arbeite gerade das Assembler Tutorial durch und programmiere meine 
Controller eigentlich in der Sprache C. Ich frage mich gerade, ob es in 
Assembler eine geschickte Vorgehensweise gibt, wie man Werte an 
Funktionen übergeben und zurückgeben kann. Im Moment nutze ich dazu die 
Register r16-r18. Gerade bei verschachtelten Funktionsaufrufen sind mir 
nun durch Unachtsamkeit einige Fehler passiert, da ich die Register 
überschrieben habe. Ich hoffe, ich habe die Problematik halbwegs 
vernünftig erklärt. Hat jemand von euch eine geschickte Vorgehensweise 
parat ?


Viele Grüße

von Detlef K. (adenin)


Lesenswert?

Irgendwann wird einmal jemand den Stack erfinden und die Befehle PUSH 
und POP. :)

von Peter II (Gast)


Lesenswert?

Guest33 schrieb:
> Hat jemand von euch eine geschickte Vorgehensweise
> parat ?

naja, man könnte es halt so wie in C machen. Immerhin wird C ja auch in 
ASM umgesetzt.

http://www.rn-wissen.de/index.php/Avr-gcc/Interna

-> Argument-Register

von Guest33 (Gast)


Lesenswert?

Das ging schnell,

danke für die Antworten.

von Matthias K. (kannichauch)


Lesenswert?

Es kommt drauf an, was Dein Assembler und Dein Controller "versteht".
Neben einem bereits erwähntem Stapel kommen Adressen im Ram in Frage, 
die den Routinen als Parametern übergeben werden oder festgelegt sind. 
Man muss z.B. drauf achten, das die Adressen nicht ins Flash oder EEProm 
zeigen.
Wenn genug Speicher da ist, kann man damit beschleunigen.
Ohne Stapel eine Rekursion zu realisieren, ist etwas schwierig.
Man müsste dann schon die Anzahl Rekursionen erfassen, also 
Adresse1.Rekursion, Adresse2.Rekursion, Stand aktualisieren usw..
Man kann ausrechnen, wann sich was lohnt. Man muss ausrechnen, ob genug 
Speicher da ist.
Was sich nicht lohnt(wenn man auswählen kann), das ist, viele Daten auf 
den Stack, mit Rekursion ist das noch ungünstiger. Man gibt dann Zeiger 
von Blocks im Ram auf den Stack oder in ein Register.
Bei Rekursionen gibt es Besonderheiten.
Variable Daten können für jeden Aufruf individuell sein, oder es gibt 
die Daten für eine Funktion/ein Unterprogramm oder für ein Programm nur 
einmal.
Auch kann man kleinere Funktionen ins Ram kopieren, wo sie dann mit 
eigenen Daten arbeiten.
Vergleich C-Assembler:
Beim 80X86 erlaubt Assembler oft eine Verdoppelung der 
Arbeitsgeschwindigkeit von C Programmen. Das ist auch davon abhängig, 
wieviele Register zur Verfügung stehen.

MfG und frohes neues

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.