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
Irgendwann wird einmal jemand den Stack erfinden und die Befehle PUSH und POP. :)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.