Forum: Mikrocontroller und Digitale Elektronik .def und include beim AVR Assembler


von Holler (Gast)


Lesenswert?

Beim Einbinden mit include fremder Quelltexte kommt man nicht umhin mit 
mehrfach definierten Registern zu arbeiten.

.def a1=r16

<include fremderCode.asm>
; Registerdefinition im fremden Code
.def a2=r16

Wenn die Register sauber über den Stack laufen, ist das kein Problem, 
hier wird das Register R16 sowohl über a1 als auch über a2 erreicht.

Meine Frage ist wie man die Warnungen des Assemblers umgeht: vor lauter 
Warungen wegen doppelt definierten Registern findet man die wirklich 
relevanten nicht mehr.

Wie definiert man ohne Warnungen?

von Harald M. (mare_crisium)


Lesenswert?

Holler,

mein Ratschlag ist, die Definitionen im fremden Code so zu ändern (mit 
Crtl-H: Replace), dass sie gleich den eigenen sind. Danach kannst Du die 
".def"s im fremden Code löschen.
Begründung: Früher oder später wirst im fremden Code etwas ändern 
wollen. Dabei kommst Du garantiert mit den eigenen und den fremden 
Definitionen durcheinander. So nach dem Motto
...
ldi a1,0x01
ldi a2,0x03
add a1,a2    ; Du erwartest als Ergebnis 0x04, heraus kommt aber 0x06
...

Solche Fehler sind dann sehr schwer zu finden.
Deshalb: Wenn überhaupt ".def"s, dann einheitlich im gesamten Programm.

mare_crisium

von spess53 (Gast)


Lesenswert?

Hi

>Wie definiert man ohne Warnungen?

Indem man diese .def-Gedödel komplett eliminiert. Für Spielzeugprogramme 
mag das ganz nett sein. Bei größeren Programmen oder bei der Erstellung 
von Librarys ist das nur noch lästig.

MfG Spess

von Jürgen (Gast)


Lesenswert?

spess53 schrieb:
> Indem man diese .def-Gedödel komplett eliminiert. Für Spielzeugprogramme
> mag das ganz nett sein. Bei größeren Programmen oder bei der Erstellung
> von Librarys ist das nur noch lästig.

Das liegt wohl eher am Programmierstiel der sich gerade bei Assembler im 
laufe der Zeit entwickelt.
Ich finde das "def-Gedödel" ganz praktisch wenn ich z.B. eine Uhr 
programmieren und benenne vorher die Register mit sekunde, minute usw. 
und brauche nachher nicht mehr nachzuschauen in welchem Register die 
Sekunden stehen. Ausserdem lese ich im Quellcode mit einem Blick heraus 
was "inc sekunden" macht, im gegensatz zu "inc r3".

Holler schrieb:
> Beim Einbinden mit include fremder Quelltexte kommt man nicht umhin mit
> mehrfach definierten Registern zu arbeiten.

Assembler ist eben mal ungeeignet um Blind aus mehreren Quellen mit Copy 
und Paste ein lauffähiges Programm zu erstellen.
Falls ich eine Library von einem anderen Programm benutze, muss ich eben 
die defs meinem Stiel anpassen. Das setzt natürlich vorraus, das ich 
(wie immer bei ASM) meinen Hirnschmalz anstrengen muss und das Programm 
analysiere und nachvollziehen kann. Das muss man ja auch wirklich nur 
einmal machen, danach passt die lib in alle nächsten projekte.

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.