Amiga Assembler – Teil 5
In einem kurzen weiteren Tutorial geht es um Befehle um einen Speicherbereich zu manipulieren. Bitshifting gehört zu den effizientesten Methoden um einen Speicherbereich zu verändern. Ich habe damals im C Unterricht noch gelernt, dass ein Shift nach Links effizienter ist als die Multiplikation mit 2.
Amiga Assembler – Teil 5
In den vorangegangenen Tutorials haben wir mit diversen Befehlen Werte gesetzt und verändert. Das waren hauptsächlich binäre Operatoren und Rechenbefehle wie addieren und subtrahieren. Ein auf binärer Ebene sehr beliebte und effiziente Möglichkeit die Werte zu verändern sind Shift Operatoren. Dabei wird das Bitmuster eines Speicherbereichs bestimmter Größe verschoben. Das funktioniert nach links und rechts und entspricht mathematisch jeweils einer Multiplikation mit oder Division durch 2.
Bitshifting
Um das Bitmuster im Speicher zu verschieben gibt es zwei (bzw. vier) Kommandos:
- LSL, LSR
Verschiebt das Bitmuster der angegebenen Größe (Byte, Word, Longword) um die angegebene Anzahl Felder nach links (LSL) oder rechts (LSR). Mathematisch entspricht das einer Multiplikation mit 2 (LSL) oder einer Division durch 2 (LSR). Neue Werte die von links oder rechts in den Speicherbereich geschoben werden sind immer 0. Ein 1010 ein Byte nach links verschoben ergibt 0100. - ROL, ROR
Im Gegensatz zum Verschieben des Musters fallen die Informationen nicht auf einer Seite aus dem Bereich sondern werden auf der anderen Seite des Speicherbereichs hineingeschoben. Ein 1010 ein Byte nach links rotiert ergibt somit 0101.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | START: ; shift values around (word size) move.w #1,d0 lsl.w #1,d0 lsl.w #1,d0 nop lsr.w #2,d0 ; shift values around (byte size) move.b #1,d0 lsl.b #1,d0 lsl.b #3,d0 nop lsr.b #3,d0 ; rotate bit pattern move.w #$A6,d0 ror.w #4,d0 rol.w #4,d0 nop |
Das Beispiel zeigt sehr deutlich wie das verschieben des Bitmusters den Wert der gespeicherten Variable verändert. Es wird Binär der Wert 0001 gesetzt und durch zweimaliges verschieben nach links rutscht der 1er, die wertige Stelle, auf die dritte Position. 0100 ist in Dezimal umgerechnet 4 und das Ergebnis von 1 * 2 * 2.
Das letzte Beispiel ist ebenfalls recht interessant. Der Wert $A6 wird in einem Word (2 Byte = 4 hexadezimal Zeichen) nach rechts rotiert. Das heißt die 4 Bits ganz rechts fallen rechts hinaus und werden links wieder hinein geschoben. Dieses Nibble wird im Debugger durch die Zahl 6 dargestellt.
Sehr viel mehr muss man über das Shiften von binären Zahlen nicht wissen.
Fazit
Bitshiften ist ein extrem effizienter Weg um den Wert eines Speicherbereichs zu verändern und wird spätestens bei der Optimierung eines Codes gerne herangezogen.
Alle Artikel dieser Artikelserie:
Programmieren auf dem Amiga
Programmieren auf dem Amiga – Teil 2
Amiga Assembler
Amiga Assembler – Teil 2
Amiga Assembler – Teil 3
Amiga Assembler – Teil 4
Amiga Assembler – Teil 5
Amiga Bibliotheken verwenden