FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Technische Informatik

T3 WiSe 04 Blatt 4

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:
[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.

Re: T3 WiSe 04 Blatt 4 2004-11-17 15:30
Anonymer User
Wie krieg ich denn eine Bitmaske mit der Größe in ein Register?

mov 0x00FF00FF,%i2


liefert zum Beispiel den Fehler:
error: constant value must be between -4096 and 4095

Kann ich das irgendwie umstellen?


Re: T3 WiSe 04 Blatt 4 2004-11-17 18:19
Zidane
0x00FF00FF ist wenn ich das recht sehe ein 32 Bit Wert…

Den bekommst du nur mit dem "sethi" Befehl in ein Register.

Versuchs mal mit :
sethi %hi(0x00FF00FF),%i2 or %i2,%lo(0x00FF00FF),%i2

Re: T3 WiSe 04 Blatt 4 2004-11-17 19:07
TriPhoenix
Ganz genau das ist des Problems Lösung

Re: T3 WiSe 04 Blatt 4 2004-11-17 20:08
Fred
error: constant value must be between -4096 and 4095

Kann ich das irgendwie umstellen?
Nein, auf einer Sparc gibt es keine Möglichkeit, Konstanten ausserhalb dieser Grenze als Parameter für die arithmetischen Operationen zu verwenden, weil 19 der 32 Bits bereits für die Bestimmung des Befehls und seiner restlichen Parameter draufgehen. Auch der mov Befehl ist eine arithmetische Operation, weil
mov imm13, %dstein synthetischer Befehl ist, welcher als
or %g0, imm13, %dstrealisiert ist. Konstanten, welche grösser als 13 Bits sind, müssen also schlimmstensfalls erst per sethi/or-Kombination in ein Register geladen werden. Dafür gibt es auch einen synthetischen Befehl:
set imm32, %dstDieser wird, abhängig von der Beschaffenheit der Konstante, entweder nur durch ein sethi, nur durch ein mov oder aus der bekannten Kombination sethi/or realisiert:
set 4000, %l0 --> mov 4000, %l0 set 0xAFFE0000, %l1 --> sethi %hi(0xAFFE0000), %l0 set 0x12345678, %l2 --> sethi %hi(0x12345678), %l2 or %l2, %lo(0x12345678), %l2Nochmal zur Erinnerung: der sethi Befehl packt die im übergebenen 22 Bits in die oberen 22 Bits des Zielregisters und löscht die unteren 10 Bits.