Forum: Mikrocontroller und Digitale Elektronik Assembler: zwei Register als Wort behandeln


von Florian S. (sirius7)


Lesenswert?

Hallo liene Community,

stehe momentan vor einer Frage und zwar, wie kann man zwei Register als 
Wort behandeln? Z.B. ich habe eine 16 Bit Zahl auf dem Stack und lade 
sie in 2 Register:

ld r16, z+
ld r17, z

...

nun möchte ich die Zahl in r16,r17 mit ror nach rechts rotieren.. wie 
stelle ich das an?

danke für die Hilfe!

: Bearbeitet durch User
von Hp M. (nachtmix)


Lesenswert?

Alex S. schrieb:
> nun möchte ich die Zahl in r16,r17 mit ror nach rechts rotieren.. wie
> stelle ich das an?

Indem du das Carry-Bit mit einbeziehst.
Also z.B. anstelle des zweiten ror den rrc Befehl verwendest.

: Bearbeitet durch User
von jörch (Gast)


Lesenswert?

Alex S. schrieb:
> nun möchte ich die Zahl in r16,r17 mit ror nach rechts rotieren.. wie
> stelle ich das an?

Es gibt keine universelle Möglichkeit. Sie ist abhängig vom µC.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

jörch schrieb:
> Es gibt keine universelle Möglichkeit.

Das Rotieren durchs Carry ist allerdings bei so gut wie allen üblichen 
MC möglich.
Der Codeschnipsel sieht mir auch sehr nach AVR8 aus.

von Florian S. (sirius7)


Lesenswert?

Hp M. schrieb:

> Also z.B. anstelle des zweiten ror den rrc Befehl verwendest.

es ist aber leider so, dass Atmel Studio dieses Befehl nicht kennt.. ich 
gehe davon aus, dass es vielleicht für Atmel - Mikrocontroller fremd 
ist.
Gibt es vielleicht andere Möglichkeiten?

danke

P.S.

ich bin erstmal bei Option geblieben, dass man nacheinander erstmal den 
höheren Register rotiert und danach den unteren. Da bei Rotation von 
höheren Register der Bit0, falls vorhanden in Carry geschoben wird, wird 
er im Bit7 des unteren Registers wieder auftauchen.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Hallo,

beim AVR heißt das lsr/lsl
Für R-Shift machst du ein LSR des H-Reg. und im Anschluss ein ROR des 
L-Reg.

Sascha

von jörch (Gast)


Lesenswert?

Alex S. schrieb:
> gehe davon aus, dass es vielleicht für Atmel - Mikrocontroller fremd

Sollen wir jetzt doch raten auf welchen µC sich die Frage bezieht oder 
teilst du uns mit, was in deinen Eröffnungspost schon reingehört.

von (prx) A. K. (prx)


Lesenswert?

Matthias S. schrieb:
> Der Codeschnipsel sieht mir auch sehr nach AVR8 aus.

Gibts noch einen anderen 8-Bitter mit R17?

von LostInMusic (Gast)


Lesenswert?

Nach rechts rotieren:

lsr r17
ror r16


Nach links rotieren:

lsl r16
rol r17

von Florian S. (sirius7)


Lesenswert?

Sascha W. schrieb:
> Hallo,
>
> beim AVR heißt das lsr/lsl
> Für R-Shift machst du ein LSR des H-Reg. und im Anschluss ein ROR des
> L-Reg.
>
> Sascha

Hallo Sascha, ich glaube lsr ist hier nicht sehr hilfreich, weil wenn 
bit0 des H-Reg 1 ist, wird er zwar in Carry geschrieben, aber von Carry 
nicht wieder in bit7 des L-Reg. D.h. bit0 des H-Reg. wird beim Rotieren 
verloren. Beim ror passiert das nicht

: Bearbeitet durch User
von Frank D. (Firma: Spezialeinheit) (feuerstein7)


Lesenswert?

Hier finde ich das sehr schön erklärt:
http://www.avr-asm-tutorial.net/avr_de/beginner/index.html

von Sascha W. (sascha-w)


Lesenswert?

Alex S. schrieb:
> Sascha W. schrieb:
>> Hallo,
>>
>> beim AVR heißt das lsr/lsl
>> Für R-Shift machst du ein LSR des H-Reg. und im Anschluss ein ROR des
>> L-Reg.
>>
>> Sascha
>
> Hallo Sascha, ich glaube lsr ist hier nicht sehr hilfreich, weil wenn
> bit0 = 1 ist, wird er zwar in Carry geschrieben, aber von Carry nicht
> wieder in bit7 des L-Reg. D.h. bit0 des H-Reg. wird beim Rotieren
> verloren. Beim ror passiert das nicht
Schau doch mal ins Datenblatt!
das LSR schiebt an b7 eine 0 rein und b0 in den CY, ROR nimmt das b0 aus 
dem H-Byte das sich ja nun in CY befindet und schiebt es auf b7 des 
L-Byte. Du musst nur für H-&L-Byte unterschiedliche Befehle verwenden! 
Wie ich schin schrieb.
Du kannst auch mit 2x ROR arbeiten, dann musst du aber vorher dafür 
sorgen das CY=0 (z.B. mit CLC), sonst hat du ein falsches Ergebnis.

Sascha

von Florian S. (sirius7)


Lesenswert?

Sascha W. schrieb:

> Du kannst auch mit 2x ROR arbeiten, dann musst du aber vorher dafür
> sorgen das CY=0 (z.B. mit CLC), sonst hat du ein falsches Ergebnis.
>
> Sascha

Ich verstehe was du meinst, dass Carry Bit nicht in H-Reg geschoben 
wird, falls vorhanden. Ja so kann man das lösen :)

nur halt das Wichtige, dass beim L-Reg unbedingt mit ror gearbeitet 
wird.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Alex S. schrieb:
> nur halt das Wichtige, dass beim L-Reg unbedingt mit ror gearbeitet
> wird.
Wie ich schon im 1. Beitrag schrieb.

Sascha

von Florian S. (sirius7)


Lesenswert?

Sascha W. schrieb:

> Wie ich schon im 1. Beitrag schrieb.
>
> Sascha

stimmt, ich habe überlesen, mein Fehler

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
Noch kein Account? Hier anmelden.