Forum: Mikrocontroller und Digitale Elektronik Registermanagement in Assembler


von nyan (Gast)


Lesenswert?

Hallo,

vor Kurzem habe ich angefangen mich näher mit der 
Assemblerprogrammierung zu beschäftigen. (Atmel xmega) Da die Programme 
nun allmählich größer werden, interessieren mich einige organisatorische 
Aspekte.

Insbesondere interessiert mich die Einteilung der Register.

Nutzt ihr z. B. für Parameter bei Unterprogrammen immer die gleichen 
Register?
Definiert ihr euch hierfür allgemeine Namen (param1, param2, …) oder 
benennt ihr sie direkt nach Aufgabe (xPosition, yPosition, …) je nach 
Unterprogramm?
Oder legt ihr Aufrufparameter gleich in den SRAM?

Verwendet ihr spezielle (also zuvor definierte) temporäre/Akku-Register 
für die gelegentliche Bitschieberei, z. B. für das Legen einer 
Bitsequenz auf einen Port oder Controlregister?

Sichert ihr bei Unterprogrammen jedes darin verwendete Register mit 
push/pop oder nur jene welche auch wirklich vorher verwendet wurden?

Gibt es noch spezielle Tipps für das Organisieren von Registern oder ein 
Assemblerprogramm im Allgemeinen?

Vielen Dank und liebe Grüße :)

von Uwe (Gast)


Lesenswert?

Man köönte sich auch gleich an eine Aufrufkonvention halten z.B. von C. 
Dann kann man später einfacher eine Hochsprache auf die Funktionen 
zugreifen lassen. cdecl, stdcall, Pascal, Register(FastCall)

von nyan (Gast)


Lesenswert?

Danke, das klingt natürlich nach einem vernünftigem Ansatz. :)

von spess53 (Gast)


Lesenswert?

Hi

>Nutzt ihr z. B. für Parameter bei Unterprogrammen immer die gleichen
>Register?

Nein. Es gibt Befehle, die nur auf bestimmte Register anwendbar sind. 
Einen Pointer auf eine Stelle im Flash in r2/r3 zu übergeben ist recht 
sinnfrei.

>Definiert ihr euch hierfür allgemeine Namen (param1, param2, …) oder
>benennt ihr sie direkt nach Aufgabe (xPosition, yPosition, …) je nach
>Unterprogramm?

Ich benutze dieses .def-Gedödel überhaupt nicht. Ein Grund dafür ist, 
das ich ich viele Sachen in eigenen Bibliotheken (Displays, Sensoren, 
Schnittstellen, mathematische Routinen...) habe. Verschiedene Bezeichner 
für ein Register in einem Programm sind nicht hilfreich, sondern nur 
verwirrend.

>Oder legt ihr Aufrufparameter gleich in den SRAM?

Kommt auf die Anzahl und die Größe der Parameter an.

Bei häufiger benutzten Unterprogrammen verwende ich für die 
Parameterübergabe meist Macros. Das erspart Schreibarbeit und ist auch 
leichter lesbar.

>Verwendet ihr spezielle (also zuvor definierte) temporäre/Akku-Register
>für die gelegentliche Bitschieberei, z. B. für das Legen einer
>Bitsequenz auf einen Port oder Controlregister?

Da kein .def, auch kein 'temp'.

>Sichert ihr bei Unterprogrammen jedes darin verwendete Register mit
>push/pop oder nur jene welche auch wirklich vorher verwendet wurden?

In Bibliotheken ja. Da weiß ich nicht von wo aus sie aufgerufen werden. 
Bei 'normalen' Unterprogrammen eher eine Ermessenssache. Allerdings 
würde ich Anfängern raten, lieber ein push/pop mehr zu verwenden als 
stundenlang einen Fehler zu suchen.


>Man köönte sich auch gleich an eine Aufrufkonvention halten z.B. von C.
>Dann kann man später einfacher eine Hochsprache auf die Funktionen
>zugreifen lassen. cdecl, stdcall, Pascal, Register(FastCall)

Warum jeden Mist nachmachen? Es sind ja gerade die Freiheiten, die 
Assembler so interessant machen.

MfG Spess

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.