PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Register 0 bis 15



The Man
23.09.2007, 07:39
Also kurz und knapp:

überall wird immer mit Register 16 - 31 gearbeitet, wofür sind die r0 - 15 zu brauchen?

izaseba
23.09.2007, 09:03
Ich kann Deine Aussage nicht nachvollziehen, ich arbeite oft mit R0-R15 als Beispiel kannst Du Dir das Programm anschauen, das ich hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32889&highlight=termometer) gepostet habe.

Gruß Sebastian

PicNick
23.09.2007, 09:54
Bit-sparen, ganz einfach

Man mußte alle Maschinenbefehle in 16-Bit (ein Befehls-Wort) unterbringen.
Es gibt also Befehlsgruppen f. Register 0-15 und f. 16 - 31
in denen sind jeweils 4-Bit für die Register-nummer, also immer 0-15
Bei den Befehlen für 16-31 wird dann automatisch 16 draufaddiert.
https://www.roboternetz.de/wissen/index.php/Atmel_Controller_Mega16_und_Mega32 ->Adressmapping
Wenn es noch weiter interne, technische Gründe dafür geben sollte (die Speicherbereiche sind ja tatsächlich nicht so einheitlich beschaffen, wie es vielleicht scheint), dann kann ich sie dir leider nicht sagen (nix weißt er).

Vielleicht kommt aber noch wer, der das weiß

Gock
23.09.2007, 11:37
Wenn man nicht täglich programmiert und die ganzen Befehle auswendig weiß, dann kann man sich schlecht merken, welche der 120 Befehle nicht mit r0-r15 funktionieren, da gibt es nämlich einige Ausnahmen. Und weil ich das Risiko nicht eingehen und auch nicht immer nachlesen will, nehme ich halt gleich r16-32, dann geht nichts schief...fast nichts, Ausnahmen gibt es auch da. Außerdem reichen die meistens aus.
Allerdings benutze ich die unteren Register trotzdem manchmal, zb zum Speichern von Flags, also wo ich sicher bin, dass ich keine komplizierten Operationen ausführen will.
Ist bei mir also eine Art Vorsichtsmaßnahme.
Gruß

wkrug
24.09.2007, 20:21
Gock hat das schon fast richtig beantwortet.

Fast alle imidiate Befehle also LDI, CPI, ORI, ANDI, usw. gehen nicht mit den Registern 0...15.
Will man also eine Konstante mit einem Register verarbeiten, funktioniert das nur mit den Registern 16 bis 31.

Beispiel:
LDI r16,0x34
OUT TCCR1,r16

würde nicht mit Register r1 gehen.

Da man aber immer solche Werte wohin übertragen muß nimmt man für Ladeoperationen halt gleich immer die Register 16...31 her.

Die letzten 6 Register lassen sich auch als Doppel Register x,y,z ansprechen.
Man kann somit indizierte Adressierungen mit Auto Increment mit nur einem Kommando ausführen.
ld r16,x+
st y+,r16

Wäre eine Verschiebung des Inhaltes von RAM Inhalt (x) nach (y) mit automatischer inkrementierung der x und y Register.

Einen Sonderfall gibts noch bei der Operation LPM, die geht bei manchen Controllern nur mit dem Register r0.

Eine genaue Beschreibung der einzelnen Befehle und der zulässigen Operatoren und Register findest Du im AVR Studio in der Hilfe unter "Assembler Help".

The Man
25.09.2007, 14:18
ok, das ist schin was.
Könnte mir jemand das kleinste Program das er zunm Thema Pointer hat mal posten?
In C hab ich die Dinger schonmal benutzt, also vom Prinzip her weiß ich schon was das ist. Ich hätte nur gerne ein konkretes Beispiel.

Danke

wkrug
25.09.2007, 17:19
Im Prinzip hab ich Dir die Antwort schon in meinem vorherigen Post gegeben

ldi XL,low(ramadr1) ; X Register vorladen
ldi XH,high(ramadr1)
ldi Yl,low(ramadr2) ; Y Register vorladen
ldi YH,high(ramadr2)
ldi r17,0xff ; Schleifenzähler auf 255 einstellen
loop:
ld r16,x+
st y+,r16
dec r17
brne loop
....
Kopiert 255 Bytes von ramadr1 nach ramadr2

Wie Du die Daten in das RAM vorab reinkriegst ist wieder eine andere Geschichte.
Mit dem Begriff Pointer würd ich ein wenig vorsichtiger umgehen.
Auch für den Stack gibt es einen Pointer auf den man aber nicht so einfach zugreifen kann.
Indexregister trifft es da schon eher.

The Man
26.09.2007, 07:23
Also, wenn ich das richtig sehe,

ist
ld r1,x+
das selbe wie
ld x+,r1
?

weil ld x+,r1 => post inc
und
ld +x,r1 => pre inc

right?

Gock
26.09.2007, 07:57
Natürlich nicht!
Du kannst nicht einfach Adressregister und Zielregister tauschen. Im Instruction Set steht die Syntax, solltest Du lesen:
LD Rd, X
Rd ist das Zielregister, X das Adressregister für die indirekte Addressierung.
LD X, Rd ergibt einen Compilierungsfehler, denke ich.
Pre oder Post increment bedeutet nur, ob er erst die Register laden soll und dann incen oder ersten incen und dann Register laden.
Gruß

The Man
26.09.2007, 10:32
m´kay, dann hängt das einfach daran, dass ich beim laden erst ziel- dann adressregister angebe und bei store das ganze umgekehrt. Und dir regeln für pre und post dann jeweils gelten.

oberallgeier
26.09.2007, 11:15
Hey Man,

genau! Die generelle Syntax ist: Befehl, Ziel, Quelle. Guck doch mal in die AVRStudio-Hilfe. Von dort stammt das folgende Beispiel (auszugsweise) zum Befehl ADD :

Description:
Adds two registers without the C flag and places the result in the destination register Rd.

Operation:

Rd <- Rd + Rr

Syntax: Operands: Program Counter:

ADD Rd,Rr 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 PC <- PC + 1

... da siehst Du, dass Rd das ZIEL-Register ist und die "Quelle" Rr dorthin verarbeitet wird.