Right Shift nötig?

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
nsawilla
Beiträge: 1267
Registriert: Mi 14. Sep 2005, 09:30
Spezialgebiet: Elektronik, AVRs
Schule/Uni/Arbeit: TU Graz Elektrotechnik
Wohnort: Graz
Danksagung erhalten: 1 Mal
Kontaktdaten:

Right Shift nötig?

Beitrag von nsawilla »

Hey Leute, hier mal eine Frage die sich besonders an alle Assemblerfreaks richtet :D
Ich bin schon wieder am Entwerfen meiner nächsten CPU (bevor die 1. überhaupt fertig gebaut ist :D ) und frage mich gerade wofür ich eigentlich eine bitweise right shift Operation implementieren soll?
Die Division durch 2, ohne Möglichkeit zu überprüfen ob die Zahl eigentlich durch 2 teilbar war, und auch nur für positive Zahlen im Zweierkomplement, scheint nicht besonders sinnvoll. Gibt es sonst irgendwo sinnvolle oder wichtige Anwendungen dafür?
Der left shift macht da schon mehr Sinn, lässt sich aber auch leicht durch Additionen ersetzen. Den right shift kann man nur sehr schwer mit anderen Funktionen "emulieren", aber wenn er nicht wirklich wichtig ist lass ich ihn weg und spar mir Hardware..
Danke im Voraus!
lg
Manch schwieriger Fall endet mit Blitz und Knall.. :mrgreen:

Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.
Benutzeravatar

raphTec
Beiträge: 501
Registriert: Mo 20. Mai 2013, 11:47

Re: Right Shift nötig?

Beitrag von raphTec »

Wenn es einen left shift gibt, sollte auch ein right shift rein meiner Meinung nach:D
Benutzeravatar

hustensaft
Beiträge: 1006
Registriert: Sa 19. Mär 2011, 19:10
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Right Shift nötig?

Beitrag von hustensaft »

nsawilla hat geschrieben:Die Division durch 2, ohne Möglichkeit zu überprüfen ob die Zahl eigentlich durch 2 teilbar war, und auch nur für positive Zahlen im Zweierkomplement, scheint nicht besonders sinnvoll.
Ein Right Shift entspricht genau der Division durch zwei eines unsigned ints. Ob die ursprüngliche Zahl ungerade oder gerade ist, ist in den meisten Fällen nicht relevant. Davon abgesehen ist ja nicht gesagt, wie eine Division in Software das berücksichtigen soll.

Nachdem ich aber hin und wieder mal (AVR-)Assemblercode schreibe, habe ich mal eben meine Ansammlungen durchsucht, wo denn ein Schieben nach rechts vorkommt:

Code: Alles auswählen

find . -iname '*.asm' -or -iname '*.s' -or -iname '*.inc' | xargs grep -Ei '(ror|lsr) '
Die Ergebnisse, die sich nicht ohne Weiteres mittels Linksshift lösen lassen:
  • Die meisten Operationen finden sich im Assemblercode von V-USB. Auf den ersten Blick sieht es dort für mich so aus: Dort wird ROR in Mengen in Kombination mit BRCC/BRCS verwendet, um Bit 0 zu prüfen, ggf. zu springen. Nach dem Sprung ist dann gleich das nächste Bit an Position 0. Wird nicht verzweigt, folgt ein LSL, sodass effektiv nur Bit 0 gelöscht wurde. Sehr geschickt gelöst.
  • Division durch 2^n. Man glaubt es kaum, aber man braucht es wirklich.
  • Software-SPI. Will man das LSB zuerst übertragen, wird es ohne Rechtsshift hässlich.
  • Erzeugen einer Bitmaske mit einer 1 an einer variablen Stelle. Je nachdem, von welcher Richtung man zählen möchte, braucht man einen Links- oder Rechtsshift, wenn man nicht vorher umrechnen möchte.
Zugegebenermaßen braucht man den Rechtsshift nicht allzu häufig. Aber wenn man ihn zur Verfügung hat, ist er manchmal sehr praktisch.
Benutzeravatar

hboy007
Beiträge: 2999
Registriert: Fr 31. Aug 2007, 12:35
Danksagung erhalten: 12 Mal

Re: Right Shift nötig?

Beitrag von hboy007 »

nsawilla hat geschrieben:Die Division durch 2, ohne Möglichkeit zu überprüfen ob die Zahl eigentlich durch 2 teilbar war, und auch nur für positive Zahlen im Zweierkomplement, scheint nicht besonders sinnvoll.

Nicht korrekt. Siehe http://www.atmel.com/images/doc0856.pdf S.100

logical shift right: bit shift, LSB wird in SREG:C verschoben. Das Carry-Flag (Übertrag bzw. Divisionsrest) lässt sich mit
BRCC (branch if carry clear)
BRCS (branch if carry set)

direkt in einer bedingten Sprunganweisung verwenden oder auf andere Register angwendet mit auf C zugreifenden Operationen weiterverwenden.

Interessiert nur, ob die Zahl gerade oder ungerade ist, kann das mit SBRS <reg_n>,0 / SBRC <reg_n>,0 geprüft werden.


Weitere Assemblerbefehle mit shift-Operationen:

ASR (arithmetic shift right): wie LSR, jedoch mit festgehaltenem MSB (sign bit)
ROR (rotate right through carry): zyklisches Vertauschen von bits
"All problems of the world could be settled easily if men wäre only willing to THINK."
Thomas J. Watson (100 Jahre IBM)
[ externes Bild ]
Benutzeravatar

Thread-Ersteller
nsawilla
Beiträge: 1267
Registriert: Mi 14. Sep 2005, 09:30
Spezialgebiet: Elektronik, AVRs
Schule/Uni/Arbeit: TU Graz Elektrotechnik
Wohnort: Graz
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Right Shift nötig?

Beitrag von nsawilla »

Nun, das rausgeschobene Bit in einem Flag zu speichern wäre natürlich möglich.. Aber die Sinnhaftigkeit des ganzen Befehls ansich offenbart sich mir noch nicht.. Ich werde jetzt mal ein bisschen mit einer Z80 spielen, und schauen welche Befehle ich am häufigsten brauche und auf welche ich verzichten kann..
Danke fürs Erste!
lg
Manch schwieriger Fall endet mit Blitz und Knall.. :mrgreen:

Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.
Antworten