Forum: Mikrocontroller und Digitale Elektronik kann register r0 bis r15 nicht ansprechen


von krühn (Gast)


Lesenswert?

Hallo!
Ich schreibe gerade meine ersten Zeilen in Assembler für einen
ATMEGA32. Mein Problem ist vermutlich aber eher allgemeiner Natur, wohl
ein Verständnisproblem...

Mein Programm sieht ungefähr so aus:
.include "m32def.inc"
.def reg0 r0
.def reg16 r16
ldi reg16, 0b00000000 ; das geht
ldi reg0,  0b00000000 ; das geht nicht

Ich verstehe nun überhaupt nicht, warum die letzte Zeile nicht
funktioniert. Compiler:
"error : Illegal argument type or count"

Bei den Register 1-15 sieht es genauso aus.

Danke schon mal
Grüße
Tobi

von Jörg Wunsch (Gast)


Lesenswert?

Wenn man Assembler programmiert, sollte man sich auch die
Befehlsreferenz des Prozessors auf den Schreibtisch legen und dort mal
reingucken...

LDI akzeptiert halt nur Register 16...31.

von krühn (Gast)


Lesenswert?

Warum ?

von crazy horse (Gast)


Lesenswert?

weil der Programmspeicher nur 16bit breit ist, demzufolge kann man nur
eine begrenzte Anzahl von Befehlen mithilfe dieser 16 bit codieren. Und
da dass Grundprinzip davon ausgeht, mit einem Zugriff auf den
Programmspeicher den kompletten Befehl zu lesen (ein paar Ausnahmen
gibts bei den Mega-Typen) muss also der Befehl (ldi), die Konstante
selbst (8bit) und die Zieladresse in 16bit untergebracht werden. Und da
dass nicht passt, hat man die Zieladresse um ein Bt gekürzt, statt 5bit
für alle 32 Register sind es nur noch 4 bit, und das reicht eben nur
für 16 Zieladressen. Dasselbe Prinzip findest du bei allen anderen
immediate-Befehlen auch (andi, ori, subi).

von Conlost (Gast)


Lesenswert?

Hallo Tobi,
das hängt irgendwie mit der Architektur des Prozessors zusammen,
genaues weiss ich leider auch nicht.

<.include "m32def.inc"
<.def reg0 r0
<.def reg16 r16
<ldi reg16, 0b00000000 ; das geht
<ldi reg0,  0b00000000 ; das geht nicht

aber:

.include "m32def.inc"
.def reg0 r0
.def reg16 r16
ldi reg16, 0b00000000 ; das geht
mov reg0,reg16        ; das geht

Bei r0 bis r15 muss man den Umweg über r16 bis r25 gehen.

Allerdings sollte man r0 für die Benutzung mit dem Z-Register
reservieren.
Denn wenn man mit Hilfe des Z-Registers aus einer Tabelle einen
Wert liest, dann steht dieser Wert automatisch im Register r0.

Gruß,
Arno

von Conlost (Gast)


Lesenswert?

Danke crazy horse, wieder was gelernt.
Ich wußte zwar das man nicht alle Befehle mit r0 bis r15
benutzen kann, aber nicht warum das so ist.
Gruß,
Arno

von kruehn (Gast)


Lesenswert?

Aha!
Danke :)
Alle Fragen geklärt :)

Grüße
Tobi

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.