ab Register r26 kein Benutzerzugriff?

Gast #256696
Lesenswert?

Hi
habe leider sehr viele Register zu belegen, siehe unten
Aber bei r26 bis r37 meckert der Compiler
"Register already defined by the .DEF directive."

.def temp = r16
.def tempA = r17
.def tempB = r21
.def temp2 = r22
.def temp3 = r23
.def aaa = r24
.def bbb = r25
.def links = r26
.def rechts = r27
.def null = r28
.def eins = r29
.def zwei = r30
.def drei = r31
.def vier = r32
.def fuenf = r33
.def sechs = r34
.def sieben = r35
.def acht = r36
.def neun = r37

welche soll ich denn sonst nehmen?
Gast #256700
Lesenswert?

Die Register 26/ 27 28/29 30/31   sind als X Y und Z Register in der
Include Datei vereinbart. Man kann sie trotzdem benutzen. Die
Compilermeldung ist nur eine Warnung.   Die höheren Register sind mir
auch nicht bekannt ( bei AVR)
Gast #256701
Lesenswert?

Die Register ab r32 aufwärts dürften nur sehr wenige Controller haben.
Ansonsten ist das nur eine Warnung, dass das Register schon mit einem
anderen Namen belegt ist. Brauchst du im Prinzip nicht zu beachten,
solange du nicht die Register mit beiden Namen ansprichst und so
Durcheinander schaffst.
Gast #256703
Lesenswert?

Hi. Du hast ja auch noch Register 0-15. Die kannst auch nehmen. Man muß
halt schaun, da bei denen nicht alle Befehle funktionieren.

Ab r26 sind die Register für die Pointer (xl,xh; yl,yh; zl,zh)schon
vordefiniert. Und deshalb sollte man sie auch nicht für andere Zwecke
nehmen.

Warum speicherst du die Register nicht ins Sram ab und liest sie dann
mit einem temp register aus?

Das würde dann so aussehn:



.def temp   = r16
.def tempA  = r17
.def tempB  = r21
.def temp2  = r22
.def temp3  = r23
.def aaa    = r24
.def bbb    = r25

.equ links  = 0x0060
.equ rechts = 0x0061
.equ null   = 0x0062
.equ eins   = 0x0063
.equ zwei   = 0x0064
.equ drei   = 0x0065
.equ vier   = 0x0066
.equ fuenf  = 0x0067
.equ sechs  = 0x0068
.equ sieben = 0x0069
.equ acht   = 0x006A
.equ neun   = 0x006B


Dann kannst du es so machen:

lds temp2,0x0060  ;aus dem Register laden
;irgenetwas berechnen mit temp2
sts 0x0060,temp2  ; und den Wert wieder speichern


Wäre vielleicht sinnvoller

Gruß Florian
Gast #256706
Lesenswert?

> ach es gibt nur 31 ??

Nein, es gibt 32. Ziemlich viel, nicht?

> was ist denn das für ein schrott?

Hm? Die x86er im PC haben 4 (7, wenn man die Offset-Register
mitzählt).

Dir ist schon klar, daß Register nur da sind, um Operanden und mal kurz
ein Zwischenergebnis abzuspeichern und nicht als RAM-Ersatz für Dutzende
von Variablen?
#256707
Lesenswert?

> ach es gibt nur 31 ?? was ist denn das für ein schrott? na werd
> wohl den plan ändern.

Hmmm... Da hast du wohl "die Rechnung ohne den Wirt gemacht"...

Vielleicht solltest du doch erstmal das Datenblatt lesen...

Wenn man erstmal verstanden hat, dass der Adressbereich

- 16 "dumme" Register (kein immidiate)
- 16 "bessere" Register (incl. Doppelregister/Pointer)
- 32 "hochwertige" (und "schnelle") I/Os (Bit-Zugriff möglich)
- 32 "schnelle" I/Os (Byte-Zugriff mit IN/OUT)
- bis zu 160 "blöde" I/Os (Extendet-I/O im SRAM-Bereich)
- internes SRAM
- externes SRAM via Speicherinterface

hat, dann sollte man damit auch klarkommen.

Welchen AVR benutzt du eigentlich?

...
Gast #256709
Lesenswert?

tschulduigung, ist natürlich kein schrott, ist mir mal eben
rausgerutscht :)

aber in der tat braucht man wohl extra sram. nun gut, die vielen
register kann ich mir ersparen, wenn ich den queltext ausweite und ein
bissl mehr "denke".

danke für die infos

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren