mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Registerverwendung AVR


Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Eine Frage zur Vwerwendung von Registern: In allen Anwendungen die man 
so im Netz findet beschränkt sich die Verwendung nur auf die obersten 16 
Register. Im Datasheet ist aber keine Einschränkung angegeben. Das 
einzige was mir jetzt durch den Einsatz von LPM aufgefallen ist, dass 
das Register R0 dort gefüllt wird. Darauf hin habe ich mal ins 
Instruction-Set(ATMega32) geschaut und habe dort festgestellt, das 
einige Anweisungen auch das Register R1 verwenden. Es gibt aber keine 
Anweisung, die eins der Register R2 bis R15 verwenden. Daher sollte es 
doch keine Probleme geben wenn man die Einschränkung auf die Register R0 
und R1 zulässt.
Vielleicht gibt es ja einen Grund, dass immer nur die obersten 16 
Register genutzt werden, nur sehe ich den nicht.

Danke für jede Erklärung.
--
Gruß Scotty

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Befehle mit Konstanten lassen sich nur auf R16+ anwenden.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>In allen Anwendungen die man so im Netz findet beschränkt sich die
>Verwendung nur auf die obersten 16 Register.

Die unteren 16 Regster haben einen etwas eingeschränkten Befehlssatz.

>Das einzige was mir jetzt durch den Einsatz von LPM aufgefallen ist, dass
>das Register R0 dort gefüllt wird.

lpm           -> r0
lpm r16,Z     -> das angegebene Register

>habe dort festgestellt, das einige Anweisungen auch das Register R1
>verwenden.

Der Hardware-Multiplizierer benutzt r1:r0 als Ergebnisregister.

>Es gibt aber keine Anweisung, die eins der Register R2 bis R15 verwenden.

Falsch!

MfG Spess

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Befehle mit Konstanten lassen sich nur auf R16+ anwenden.

Bestimmte Rechenoperationen ebenfalls.

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>In allen Anwendungen die man so im Netz findet beschränkt sich die
>>Verwendung nur auf die obersten 16 Register.
>
> Die unteren 16 Regster haben einen etwas eingeschränkten Befehlssatz.

Hallo Spess,
wo steht das? Im Gegensatz dazu steht in der Doku:
"The high-performance AVR ALU operates in direct connection with all the 
32 general purpose
working registers."

>>Das einzige was mir jetzt durch den Einsatz von LPM aufgefallen ist, dass
>>das Register R0 dort gefüllt wird.
>
> lpm           -> r0
> lpm r16,Z     -> das angegebene Register

Hier heißt es aber:
LPM Rd, Z ; Rd ← (Z)
Wobei nich einschränkt ist welches der Datenregister Rd ist.

>>habe dort festgestellt, das einige Anweisungen auch das Register R1
>
>>verwenden.

> Der Hardware-Multiplizierer benutzt r1:r0 als Ergebnisregister.

Genau an solchen Anweisungen ist es mir aufgefallen. In der Doku steht 
dort auch explizit: R1:R0 ← Rd x Rr

>>Es gibt aber keine Anweisung, die eins der Register R2 bis R15 verwenden.

> Falsch!

Welche denn? In der Doku ist soetwas nicht zu finden:
R3:R2 ← Rd x Rr
--
Gruß Scotty

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karsten Sosna schrieb:
>>>In allen Anwendungen die man so im Netz findet beschränkt sich die
>>>Verwendung nur auf die obersten 16 Register.
>>
>> Die unteren 16 Regster haben einen etwas eingeschränkten Befehlssatz.
>
> Hallo Spess,
> wo steht das? Im Gegensatz dazu steht in der Doku:
> "The high-performance AVR ALU operates in direct connection with all the
> 32 general purpose
> working registers."

Du redest jetzt nur von der ALU
Aber sieh dir zb mal den Befehl LDI an. Der geht nur ab R16 aufwärts.
Wenn ich daher sowieso schon 2 Anweisungen brauche um eine Konstante in 
ein unteres Register zu manövrieren, dann kann ich auch gleich 
hauptsächlich mit den oberen Registern arbeiten, wenn ich den Platz dazu 
habe.

MULS ist ein weiterer Kandidat. Wenn du die Instruction Help im 
AVR-Studio durchgehst, findest du sicherlich noch einige Befehle mehr, 
die auf Register >= 16 beschränkt sind.

Die Beschränkung kommt ja nicht von der ALU an sich, sondern daher, dass 
man im Opcode des jeweiligen Befehls einfach nicht mehr Bits zur 
Codierung des/der Register zur Verfügung hat. Wenn ein kompletter Befehl 
aus 16 Bit besteht, dann braucht man einen gewissen Anteil davon um die 
eigentliche Operation zu kodieren und mit den restlichen Bits muss man 
so gut es geht die Operanden abdecken können. Bei Atmel hat man sich im 
Zweifelsfall dann eben dafür entschieden, bei konstanten Werten lieber 
ein Bit mehr in die Konstante zu packen und dafür nur die Hälfte der 
Register ansprechbar zu machen.

  LDI  Rd, K

wird im Opcode Bitmässig so umgesetzt

   1110 KKKK dddd KKKK

Für d, also die Registernummer hat man nur 4 Bit. Man hätte natürlich 
auch 5 Bit dafür nehmen können, aber dann könnte K nicht mehr alle Werte 
von 0 bis 255 annehmen, weil für K dann nur noch 7 Bit anstelle von 8 
zur Verfügung stehen. Da dies aber wesentlich unangenehmer wäre, hat man 
sich eben dazu entschlossen mittels d nur 16 Register ansprechbar zu 
haben und im Sinne der Konsuistenz mit anderen Befehlen sind dann die 
Register mit den nummern 0 bis 15 nicht direkt erreichbar. Das muss 
nicht so sein, sondern ist eine willkürliche Entscheidung. Man hätte ja 
auch sagen können: mit den d Bits werden die Register 0 bis 15 
angesprochen und die oberen 16 Register sind so nicht direkt erreichbar. 
Wäre grundsätzlich möglich gewesen. Dann hätte man aber wiederrum das 
Problem, dass man zb in die speziellen Pointer-Register wiederrum keinen 
Wert direkt laden kann. Gut, auch das wäre kein Problem gewesen, denn es 
gibt ja keine gottgegebene Vorschrift, dass die Pointerregister 
ausgerechnet in den oberen 16 Registern zu finden sind. Die hätte man 
auch woanders hingeben können.
Langer Rede kurzer Sinn: Gewisse Einschränkungen sind technologisch 
bedingt und man muss dann eine Entscheidung treffen. Das die 
Entscheidungen so getroffen wurden, hängt damit zusammen, dass man den 
Befehlssatz als Ganzes sehen muss und den möglichst rund haben möchte.

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.