Viele Register definieren

Gast #2937641
Lesenswert?

Hallo!

Ich programmiere in Assembler einen ATMEGA168. Da ich in meinem Programm 
viele Werte in Register speichern muss, welche mehr als 30 sind, ist die 
Frage wie ich das am besten mache. Im Ram hab ich ja nur r0 bis r31 und 
da kann ich auch nicht alle nutzen.

Gibt es irgendeine andere möglichkeit Register mit einem Namen zu 
definieren im Flash oder EEProm , die ich dann nutzen kann.
Also Adresse mit einem Namen versehen.
Wie macht ihr das wenn man sehr viele Register benötigt?

MfG
#2937656
Lesenswert?

Man legt keine Variablen in Register, sondern in den SRAM.
Ist zwar mehr Code, aber dafür behält man die Übersicht. D.h. man kann 
den Code auch später noch erweitern.

Register nimmt man nur für temporäre Variablen (Schleifenzähler, 
Arbeitsregister).


Peter
Gast #2937666
Lesenswert?

Hi
Zur Klarstellung: Register können die Befehle ausführen, die einfachen 
Speicherzellen nicht. Eine Speicherzelle deklarierst du wie eine 
Variable:
1
DSeg:      ; Begin Datensegment
2
erste_Var:    .Byte 1      ; Speicheradresse 0
3
zweite_Var:   .Byte 1      ; Speicheradresse 1
4
Var_Array:    .Byte 10     ; Speicheradresse 2 - 11
5
etc.                       ; Speicheradresse 12
Da du dort nur Werte ablegen bzw. lesen kannst, musst du die Inhalte zur 
Bearbeitung in ein Register laden:
1
CSeg:      ; Begin Codesegment
2
....       ; initialisieren
3
Loop:      ; Programmschleife
4
    LDS  R16, erste_Var ; Speicheradresse 0 holen
5
    COM  R16            ; Bits drehen
6
    STS  erste_Var, R16 ; und zurückschreiben
7
uvm.
Ich hoffe, das bringt dir Licht in deine gedanken....
Gruß oldmax
Gast #2937668
Lesenswert?

was ist daran falsch nur mit register zu arbeiten? Für kleine Programm 
die auch noch schnell sein müssen ist das doch der ideal.

Man könnte, wenn man nur temporär ein paar mehr register braucht mit 
push und pop arbeiten. Das ständig laden und speihern im sram kostet nur 
zeit.
Gast #2937676
Lesenswert?

TopSP schrieb:
> Danke für die Antworten.
>
> .dseg
> name: .byte 1
>
>
> name ist klar. da schreib ich meinen namen vom Register rein.
Nein. Das sind KEINE REGISTER, das sind Stellen im SRAM. Register sind 
nur r0-r31.

>  Aber was
> muss ich statt .byte 1 schreiben?
Genau das: .byte 1 Zu mindestens beim Assembler vom AVR-Studio.
> was sag ich dem ATMEGA damit ?
Du sagst DEM ASSEMBLER damit: Reserviere mir 1 Byte und nenne die Stelle 
name.
#2938574
Lesenswert?

Meister Eder schrieb im Beitrag #2938199:

> Für jemanden, den PICs nicht interessieren nimmst du es ganz schön
> genau, obwohl diese Haarspalterei weder deine Aussagen bestätigt noch
> meine widerlegt. Dir muss ja echt langweilig sein.

Dann zeig doch mal wo, von mir aus auch in der PIC-Welt, von Registern 
im Sinne von Ram-Variablen gesprochen wird. Ich hab das noch nie gehört, 
lerne aber gerne dazu.
Darum habe ich auch sofort Wikipedia Konsultiert und auch dort heißt es:

> Als Register bezeichnet man in der Digital- oder Computertechnik
> Speicherbereiche, die innerhalb eines Prozessors direkt mit der
> eigentlichen
> Recheneinheit verbunden sind und die unmittelbaren Operanden und
> Ergebnisse aller Berechnungen aufnehmen. Register sind in der Regel
> höchstens so groß wie die Wortgröße des Prozessors (8, 16, 32 oder 64 Bit).

Auch andere Definitionen haben diesen Tenor. Ausschlaggebend für die 
Definition ist auch oft die Tatsache dass Register genauso schnell sind 
wie die CPU, da aus demselben Material und auf dem selben Die. Und das 
schließt Arbeitsspeicher welcher über einen Bus angeschlossen ist, 
definitv aus.

Und da schließt sich der Kreis zur Eingangsfrage. Man kann also nicht 
mehr Register bekommen, da die Anzahl der Register durch die Hardware 
festgelegt ist.

gruß cyblord
Gast #2938622
Lesenswert?

>Microchip benennt seit jeher das RAM der PICs als GPR - general purpose
>register.
Ja. PIC kann mit dem RAM ja auch direkt rechnen. Zumindest die RAM-Zelle 
als Source und (manchmal) auch als Destin. nutzen (allerd. nicht die 
zwei gleichzeitig in einem Befehl (jedenfalls bei den kleineren)). Die 
Grösse der PIC- GPR-Files hängt von der Breite der 'f'-Bits im OP-Code 
ab.

AVR hat (wie ja hier jeder weiss) auch ein GPR-File, aber nur 32 Reg. 
Dieses GPR-File ist universeller als im PIC, weil ja jedes der 32 Reg 
für Source und Destin benutzt werden kann. Es ist aber auch kleiner als 
das im PIC, weil PIC bis zu 13 f-Bits (also für max 8kB) (mache Befehle, 
MOV, bis 16 f-Bits) im Opcode reserviert.
(Also diese beiden 'Modelle' haben Vor- und auch Nachteile)

typ Akkumasch. (bsp HC11,STM8) können für Berechn auch Werte direkt ausm 
Mem holen, aber nicht (bei Berechn) dort rein schreiben. Da ist es 
Geschmackssache, ob man dieses Mem dann Reg-Mem nennen soll oder darf. 
Wenn mit Mem aber nichts ausser LD/ST angestellt werden kann, darf man 
es wohl eher nicht Register-Mem nennen, denn das wäre wohl eine 
Irreführung.
Moderator (Firma: Titel) Persönliche Seite #2938787
Lesenswert?

troll schrieb:
> Leute, beruhigt euch sonst endet das mit einem Schloss...
Nein, ich lösche nur den privaten Kleinkrieg um "Register" und "RAM" auf 
der Ebene von "unter der Gürtellinie" und "unsachlich" raus...

cyblord ---- schrieb:
> Register bezeichnen CPU-Register. Und keine normalen Variablen im Ram.
Auch im 8051/52/535ff sind die Registerbänke ins RAM gemappt:
http://www.8052.com/tutmemor.php

Aber hier geht es ja nicht um PICs und nicht um 8051ff, sondern um AVR.
Und da sind das keine Teile vom RAM. Die korrekte Antwort wurde also 
schon in den ersten beiden Antwortposts gegeben.

TopSP schrieb:
> Wie macht ihr das wenn man sehr viele Register benötigt?
So wie alle anderen auch.
Hast du dir evtl. einfach mal andere Programme angeschaut?
Immerhin hast du Glück: du bist nicht der Erste, der sowas machen 
will...
#2939084
Lesenswert?

cyblord ---- schrieb:
> Meister Eder schrieb im Beitrag #2938199:
>
>> Für jemanden, den PICs nicht interessieren nimmst du es ganz schön
>> genau, obwohl diese Haarspalterei weder deine Aussagen bestätigt noch
>> meine widerlegt. Dir muss ja echt langweilig sein.
>
> Dann zeig doch mal wo, von mir aus auch in der PIC-Welt, von Registern
> im Sinne von Ram-Variablen gesprochen wird. Ich hab das noch nie gehört,
> lerne aber gerne dazu.
> Darum habe ich auch sofort Wikipedia Konsultiert und auch dort heißt es:

Um das noch zu beantworten: Ich habe nicht gemeint, dass man Variablen 
im RAM als Register bezeichnen muss, sondern dass für manche Leute 
nach ersten Erfahrungen mit z.B. PIC16 das RAM und general purpose 
register das gleiche sind und diese Bezeichnung auch bei anderen 
Mikrocontrollern anwenden. Dass daraus Mißverständnisse entstehen ist 
klar. Daher wollte ich einfach der Aussage "Register sind nicht RAM" 
hinzufügen, dass die Bezeichnung "CPU-Register" dagegen eindeutig ist.

Nebenbei: Das von dir verwendete Zitat war eine Reaktion auf Thomas, 
dessen Beiträge nun nicht mehr vorhanden sind.

@Lothar
> Aber hier geht es ja nicht um PICs und nicht um 8051ff, sondern um AVR.

Das war mir auch klar. Mein Beitrag ging dahin, dass vielleicht nicht 
jeder AVR-Neuling sofort die korrekte Terminologie verwendet. Konnte ja 
nicht ahnen, dass sich Thomas derart auf den Schlips getreten fühlt, 
weil ich auf den Beitrag eines Nutzers namens "troll" antworte.

> Und da sind das keine Teile vom RAM. Die korrekte Antwort wurde also
> schon in den ersten beiden Antwortposts gegeben.

Diese Antwort habe ich auch nie angezweifelt. Genauso wenig habe ich 
einen "Kleinkrieg" entfachen wollen, tut mir leid dass das nun so 
dargestellt wird.

Euch allen ein schönes Wochenende!
#2939095
Lesenswert?

Meister Eder schrieb:

> Um das noch zu beantworten: Ich habe nicht gemeint, dass man Variablen
> im RAM als Register bezeichnen muss, sondern dass für manche Leute
> nach ersten Erfahrungen mit z.B. PIC16 das RAM und general purpose
> register das gleiche sind und diese Bezeichnung auch bei anderen
> Mikrocontrollern anwenden. Dass daraus Mißverständnisse entstehen ist
> klar. Daher wollte ich einfach der Aussage "Register sind nicht RAM"
> hinzufügen, dass die Bezeichnung "CPU-Register" dagegen eindeutig ist.

Man bringt aber speziell Neulinge auch oft nur durcheinander, wenn man 
Wortklauberei betreibt, die im konkreten Fall der Sache nicht wirklich 
dienlich ist.

Bis er soweit ist, dass diese Feinheit für ihn auf einem anderen µC 
relevant wird, rinnt noch viel Wasser die Donau hinunter.

Und bis dahin bringt ihn die einfache Sprach-Regelung

Register    sind Speicherzellen in der CPU, mit der die CPU direkt
            rechnen/arbeiten kann

RAM         ist Arbeitsspeicher, in den und aus dem die CPU Werte
            in/von Registern laden kann um sich so ein paar Register
            für andere Berechnungen frei zu machen. RAM ist das
            'Kellerabteil' in welchem man das Gerümpel zwischenlagert,
            welches man in der Küche jetzt nicht gerade braucht, das
            dort aber in den Schränken Platz verbraucht.

viel mehr weiter, als alle Wortklauberei und Spezialfälle in diversen 
anderen CPUs zusammengenommen.
#2939105
Lesenswert?

Karl Heinz Buchegger schrieb:
> Und bis dahin bringt ihn die einfache Sprach-Regelung
>
> Register    sind Speicherzellen in der CPU, mit der die CPU direkt
>             rechnen/arbeiten kann
>
> RAM         ist Arbeitsspeicher, in den und aus dem die CPU Werte
>             in/von Registern laden kann um sich so ein paar Register
>             für andere Berechnungen frei zu machen. RAM ist das
>             'Kellerabteil' in welchem man das Gerümpel zwischenlagert,
>             welches man in der Küche jetzt nicht gerade braucht, das
>             dort aber in den Schränken Platz verbraucht.
>
> viel mehr weiter, als alle Wortklauberei und Spezialfälle in diversen
> anderen CPUs zusammengenommen.

Ja, du hast recht und es tut mir leid dass ich diese "Wortklauberei" 
begangen habe. Aber berücksichtige bitte, dass PIC16 für viele Studenten 
zum Stoff gehört (sogar immer noch der alte 16f84a) und ich keinen 
seltenen Spezialfall aus dem Ärmel gezogen habe den man mit der Lupe 
suchen muss sondern etwas, das hier im Forum auch immer wieder 
auftaucht.

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