mikrocontroller.net

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


Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn an LSR, ROR, LSL, ROL so großartig komplex ?


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab noch SWAP vergessen

Peter

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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

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


Peter

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.