Hi! Kann man mit logischen Operationen (EOR, OR und AND) gezielt Bits in einem Registerpaar um 0 bis 7 Bits innerhalb weniger Taktzyklen verschieben? Also ohne lsr und ror und dann noch variabel. MfG Andi
Nein. EOR, OR und AND arbeiten bitweise, d.h. jedes Bit des ersten Operanden wird mit dem entsprechenden Bit des zweiten Operanden verknüpft. Diese Verknüpfung wirkt sich jeweils nur auf dieses eine Bit aus, also sind Verschiebungen auf die Weise nicht möglich.
Das habe ich befürchtet. Dachte an die Möglichkeit, das man mit 3 EOR-Befehlen die Inhalte zweier Register austauschen kann, hier im Wiki zu finden, und war der Ansicht, das mit verschiedenen Bitmasken, je nach Anzahl der Verschiebungen, zum Verschieben der Bits nutzbar zu machen. Aber was nicht geht, geht nicht, wenn, dann wird es evtl. komplexer. Vielen Dank für Deine Antwort! MfG Andi
Was ist denn an LSR, ROR, LSL, ROL so großartig komplex ? Peter
Daran ist nichts komplex, meinte das in Bezug von logischen Verknüpfungen Bits zu verschieben wenn es überhaupt möglich wäre. Im Moment sieht meine Bit-Schieberei so aus: .def tb=r11 .def i=r24 .def j=r25 sbrs tb,2 rjmp DCL51 swap i mov j,i andi i,0x0f andi j,0xf0 DCL51: sbrs tb,1 rjmp DCL52 lsr i ror j lsr i ror j DCL52: sbrs tb,0 rjmp DCL7 lsr i ror j DCL7: ..... Komme damit auf mind. 9 Takte für 0 Bits bis 16 Takte für 7 Bits. Mache ich eine 0-Prüfung hinzu ("tst tb", "breq ...") sind es 3 Takte bei 0 aber für alle anderen Möglichkeiten (1 bis 7) jeweils 2 Takte mehr, gar nicht gut. Dachte, man könnte das vielleicht mit logischen Verknüpfungen noch ein paar Takte schneller hinbekommen. Hast Du noch Ideen? MfG Andi
Ne, durch unkommentierte Sourcen kämpfe ich mich nicht durch. Du must schon sagen, was der Code überhaupt machen soll. Peter
Habe gemeint, das man das erkennt. Also: In tb ist die Anzahl der Bits zum Verschieben. In i das zu verschiebende Byte. In j der "Auffangbehälter" der hinausgeschobenen Bits aus i. .def tb=r11 .def i=r24 .def j=r25 sbrs tb,2 ;Wird mindestens 4 mal geschoben? (Bit 2 = 1). rjmp DCL51 swap i ;Dann 4 mal schieben per Nibble-Austausch. mov j,i ;Selbes Ergebnis in das Auffangregister. andi i,0x0f ;Im Ausgangsregister nur die unteren 4 Bits. andi j,0xf0 ;Im Auffangregister nur die oberen 4 Bits. DCL51: sbrs tb,1 ;Muß auch 2 mal geschoben werden? (Bit 1 = 1). rjmp DCL52 lsr i ;Dann 2 Bits über Register i und j schieben. ror j lsr i ror j DCL52: sbrs tb,0 ;Muß auch 1 mal geschoben werden? (Bit 1 = 1). rjmp DCL7 lsr i ;Dann 1 Bit über Register i und j schieben. ror j DCL7: ..... Die Routine ist ein Teil zur Ausgabe von Grafiken (Fonts, Bitmaps) auf jede X-Beliebige Pixelposition und wollte noch etwas optimieren. MfG Andi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.