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
Right Shift nötig?
Moderatoren: MaxZ, ebastler, SeriousD
-
- 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?
Manch schwieriger Fall endet mit Blitz und Knall..
Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.
Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.
-
- Beiträge: 501
- Registriert: Mo 20. Mai 2013, 11:47
Re: Right Shift nötig?
Wenn es einen left shift gibt, sollte auch ein right shift rein meiner Meinung nach:D
-
- Beiträge: 1006
- Registriert: Sa 19. Mär 2011, 19:10
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Right Shift nötig?
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.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.
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 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.
Re: Right Shift nötig?
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 ]
Thomas J. Watson (100 Jahre IBM)
[ externes Bild ]
-
- 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?
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
Danke fürs Erste!
lg
Manch schwieriger Fall endet mit Blitz und Knall..
Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.
Ich hafte nicht für die inhaltliche Korrektheit meine Beiträge, sowie für Sach- oder Personenschäden.