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
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
A. K. schrieb: > Befehle mit Konstanten lassen sich nur auf R16+ anwenden. Bestimmte Rechenoperationen ebenfalls.
>>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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.