mikrocontroller.net

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


Autor: krühn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: krühn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum ?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kruehn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha!
Danke :)
Alle Fragen geklärt :)

Grüße
Tobi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.