Direkte Adressierbarkeit von Registern

OP #566053
Lesenswert?

Hallo,

ich frage mich schon lange, warum beim 8-bit RISC ARR die Register 0 - 
15 nicht direkt mit z.B. LDI verwendet werden können, sondern nur die 
Register 16-31. Das Einzige, was mir mal gesagt wurde war, es seien 
architektonische Gründe, aber weiß jemande welche?
Vielen Dank schon mal!

Gruß Beni
Gast #566057
Lesenswert?

Du hast in einem Befehlswort nur eine bestimmte Anzahl Bits.
Und jeder Mikroprozessordesigner muss sich entscheiden, welche Befehle 
er damit umsetzt. Wenn Du LDI mit allen Registern haben willst, brauchst 
Du ein Bit mehr. Das fehlt dann woanders.
Also müssen dann andere Befehle beschnitten oder ganz weggelassen 
werden. Oder Du nimmst ein Bit bei der Konstante bei LDI weg.
Anstatt 0-255 könntest Du dann nur 0-127 als Wert bei LDI benutzen.
Gast #566105
Lesenswert?

LDI ist 16 bit breit. Für den Wert werden 8 Bits benötigt. Wenn du nun 
alle 32 Register ansprechen können willst, brauchst du für die 
Registernummer nochmals 5 Bits. Es bleiben also nur noch 3 Bits für den 
Opcode übrig. Das ist zu mager. Es gibt ja noch andere Befehle dieser 
Art (z.B. ANDI, ORI, SUBI, SBCI). So wäre fast kein Platz mehr für die 
ganzen anderen Befehle übrig.
#566487
Lesenswert?

Läubi Mail@laeubi.de wrote:
> kommt immer drauf an:
>
> ldi tmp, 123
> mov r0, tmp
>
> kann z.B. durch nen Interupt unterbrochen werden!

Na und? Wenn die ISR sauber programmiert ist stört das nicht weiter.

>
> also müßte man eigentlich schreiben:
>
> cli
> ldi tmp, 123
> mov r0, tmp
> sei

Nööö, man muss nur in der ISR alle verwendeten Register sichern 
(push/pop) und das SREG sichern, damit das Auftreten des Int zwischen 
einem flagbeeinflussendem Befehl (Operation, Vergleich) und der darauf 
folgenden bedingten Verzweigung (brXX) keine Flags verändert.

>
> und ganz eiogentlich:
>
> cli
> push tmp
> ldi tmp, 123
> mov r0, tmp
> pop tmp
> sei

Nöö, auch nicht, das muss in der ISR geschehen.

Allerdings gibt es Fälle, wo das Sperren des Interrupts nötig ist, 
nämlich dann, wenn Main und ISR auf dieselben (I/O-)Register zugreifen. 
Suche mal nach "atomar", da bekommst Du gute Erklärungen von PeDa. Auch 
beim Setzen des Brennimpulses beim (internen) EEPROM muss der Interrupt 
gesperrt werden, damit er nicht zwischen Aufhebung des Schreibschutzes 
(eemwe) und Schreiben (eewe) auftreten kann, was den Schreibschutz (der 
gilt nur 4 Takte) deaktivieren könnte.

>
>
> Läßt sich natürlich alles durch saubere programmierung verhindern und
> "hinbiegen" ;)

Richtig, saubere Programmierung ist oberstes Gebot. Es gelingt mir aber 
auch nicht immer... ;-)

...

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