T3 WiSe 04 Blatt 4
2004-11-14 18:53
Fred
Da ich heute besonders in meiner ersten Übungsgruppe kaum zur Besprechung des nächsten Aufgabenzettels gekommen bin, möchte ich Euch auf diesem Weg noch ein bischen Handwerkszeug zum Thema "Hantieren mit Bits in Assembler" mitgeben.
Zunächst zwei langweilige Tabellen:
and und or sind Operatoren, welche ihre beiden Argumente bitweise verknüpfen (im Gegensatz z.B. zur Addition, wo von rechts nach links addiert wird und Überläufe bei der nächsten Stelle mitaddiert werden). Man benutzt sie gerne zum gezielten Löschen (and) und Setzen (or) von bestimmten Bits in einem Register. Dazu macht man sich die folgenden Eigenschaften zunutze:
Wenn wir nun also bestimmte Bits in einem Register auf Null setzten wollen, müssen wir eine Bitmaske generieren, die an den zu löschenden Stellen 0 ist und an allen anderen Stellen 1. Dann verknüpfen wir das Quellregister mit unserer Bitmaske bitweise und.
Wenn wir bestimmte Bits setzen wollen, muss die Bitmaske an den zu setzenden Stellen 1 sein und an allen anderen 0, und wir verknüpfen das Quellregister mit unserer Bitmaske bitweise oder:
Auf ganze Bytes im Sedezimalsystem übertragen bedeutet dies: wenn wir Bytes löschen wollen, so muss die Bitmaske an den entsprechenden Stellen 0x00 sein, an allen anderen Stellen 0xff. Dann wird wieder bitweise und verknüpft.
Zunächst zwei langweilige Tabellen:
[b]and or[/b]
& 0 1 | 0 1
0 0 0 0 0 1
1 0 1 1 1 1
and und or sind Operatoren, welche ihre beiden Argumente bitweise verknüpfen (im Gegensatz z.B. zur Addition, wo von rechts nach links addiert wird und Überläufe bei der nächsten Stelle mitaddiert werden). Man benutzt sie gerne zum gezielten Löschen (and) und Setzen (or) von bestimmten Bits in einem Register. Dazu macht man sich die folgenden Eigenschaften zunutze:
x & 0 = 0 <-- [b]&0 setzt Bit auf 0[/b]
x & 1 = x <-- &1 lässt Bit unangetastet
x | 1 = 1 <-- [b]|1 setzt Bit auf 1[/b]
x | 0 = x <-- |0 lässt Bit unangetastet
Diese Eigenschaften können sofort anhand der Tabellen nachgeprüft und bestätigt werden: in der 0-Zeile von & sind nur Nullen, in der 1-Zeile von | sind nur Einsen - die jeweils andere Zeile dagegen entspricht der Kopfzeile (=x).Wenn wir nun also bestimmte Bits in einem Register auf Null setzten wollen, müssen wir eine Bitmaske generieren, die an den zu löschenden Stellen 0 ist und an allen anderen Stellen 1. Dann verknüpfen wir das Quellregister mit unserer Bitmaske bitweise und.
ponmlkjihgfedcba
& 0000111100110101
----------------
= 0000lkji00fe0c0a
Jeder Buchstabe steht dabei für eine binäre Ziffer, also ein Bit (dieses Beispielregister ist also nur 16 Bit breit).Wenn wir bestimmte Bits setzen wollen, muss die Bitmaske an den zu setzenden Stellen 1 sein und an allen anderen 0, und wir verknüpfen das Quellregister mit unserer Bitmaske bitweise oder:
ponmlkjihgfedcba
| 1111000011001010
----------------
= 1111lkji11fe1c1a
Auf ganze Bytes im Sedezimalsystem übertragen bedeutet dies: wenn wir Bytes löschen wollen, so muss die Bitmaske an den entsprechenden Stellen 0x00 sein, an allen anderen Stellen 0xff. Dann wird wieder bitweise und verknüpft.
0x9A7B1182
& 0x00FF00FF
------------
= 0x007B0082
Hier habe ich konkrete Zahlen als Beispiel verwendet.