Seite 1 von 1
Right Shift nötig?
Verfasst: Mo 15. Sep 2014, 20:28
von nsawilla
Hey Leute, hier mal eine Frage die sich besonders an alle Assemblerfreaks richtet

Ich bin schon wieder am Entwerfen meiner nächsten CPU (bevor die 1. überhaupt fertig gebaut ist

) 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
Re: Right Shift nötig?
Verfasst: Mo 15. Sep 2014, 20:32
von raphTec
Wenn es einen left shift gibt, sollte auch ein right shift rein meiner Meinung nach:D
Re: Right Shift nötig?
Verfasst: Mo 15. Sep 2014, 21:17
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.
Re: Right Shift nötig?
Verfasst: Di 16. Sep 2014, 12:04
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
Re: Right Shift nötig?
Verfasst: Fr 3. Okt 2014, 18:42
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