Forum: Mikrocontroller und Digitale Elektronik AVR: Bitverschiebung möglich mit OR und EOR?


von Andi K. (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Andi K. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Was ist denn an LSR, ROR, LSL, ROL so großartig komplex ?


Peter

von Peter D. (peda)


Lesenswert?

Hab noch SWAP vergessen

Peter

von Andi K. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Ne, durch unkommentierte Sourcen kämpfe ich mich nicht durch.

Du must schon sagen, was der Code überhaupt machen soll.


Peter

von Andi K. (Gast)


Lesenswert?

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