Discussion:
Visual Studio Intrinsic für "Kompression" eines Registers
(zu alt für eine Antwort)
Hipo
2006-05-22 08:45:37 UTC
Permalink
Hi.
Gibt es grundsätzlich einen Assemblerbefehl (64 bit Plattform), der es
erlaubt Daten eines Register zu "komprimieren", und zwar nach folgendem
Schema:

RAX: 0xAF650B76
RBX: 0xF0F0F0F0

RAX stellt dabei meine Daten dar, in RBX liegt eine Bitmaske, mit Hilfe
von AND wird die Hälfte von RAX eliminiert. Was in RAX übrig bleibt ist
0xA0600070. Ich möchte jetzt die 0en zwischen den Werten eliminieren.
Deshalb meine Frage ob es einen entsprechenden Befehl gibt und ob etwas
dieser Art von Visual C++ Intrinsics unterstütz wird?

mfg, Hipo
Jan Bruns
2006-05-22 17:58:10 UTC
Permalink
Post by Hipo
Gibt es grundsätzlich einen Assemblerbefehl (64 bit Plattform), der es
erlaubt Daten eines Register zu "komprimieren", und zwar nach folgendem
RAX: 0xAF650B76
RBX: 0xF0F0F0F0
RAX stellt dabei meine Daten dar, in RBX liegt eine Bitmaske, mit Hilfe
von AND wird die Hälfte von RAX eliminiert. Was in RAX übrig bleibt ist
0xA0600070. Ich möchte jetzt die 0en zwischen den Werten eliminieren.
Deshalb meine Frage ob es einen entsprechenden Befehl gibt und ob etwas
dieser Art von Visual C++ Intrinsics unterstütz wird?
Möglich, daß es im 64-Bit Modus dafür 'n extra Befehl gibt.

Im 32-Bit Modus könnte man bspw. sowas machen:

mov eax,$AF650B76
and eax,$F0F0F0F0
mov ebx,eax
shr ebx,20
or eax,ebx
and eax,$0000FFFF

Dann ist aber noch die Reihenfolge der Hex-Ziffern verkehrt,
aber Du hast ja auch nur nach "Kompression" gefragt.

Gruss

Jan Bruns
Sebastian Biallas
2006-05-22 18:33:11 UTC
Permalink
Post by Hipo
Hi.
Gibt es grundsätzlich einen Assemblerbefehl (64 bit Plattform), der es
erlaubt Daten eines Register zu "komprimieren", und zwar nach folgendem
RAX: 0xAF650B76
RBX: 0xF0F0F0F0
RAX stellt dabei meine Daten dar, in RBX liegt eine Bitmaske, mit Hilfe
von AND wird die Hälfte von RAX eliminiert. Was in RAX übrig bleibt ist
0xA0600070. Ich möchte jetzt die 0en zwischen den Werten eliminieren.
Welches Ergebnis willst Du haben? 0xa67 oder 0xa607? Falls letzteres:
Dafür gibt es MMX bzw SSE-Befehle (packXXX), die die komplette Operation
übernehmen.
--
Gruß,
Sebastian
Jan Bruns
2006-05-22 18:52:52 UTC
Permalink
Post by Sebastian Biallas
Post by Hipo
Gibt es grundsätzlich einen Assemblerbefehl (64 bit Plattform), der es
erlaubt Daten eines Register zu "komprimieren", und zwar nach folgendem
RAX: 0xAF650B76
RBX: 0xF0F0F0F0
RAX stellt dabei meine Daten dar, in RBX liegt eine Bitmaske, mit Hilfe
von AND wird die Hälfte von RAX eliminiert. Was in RAX übrig bleibt ist
0xA0600070. Ich möchte jetzt die 0en zwischen den Werten eliminieren.
Dafür gibt es MMX bzw SSE-Befehle (packXXX), die die komplette Operation
übernehmen.
Ist gut, daß Du's erwähnst. Aber ich meine doch, daß bei MMX
die kleinste Verarbeitungseinheit das Byte ist. Für SSE weiß ich
gerade nicht, schlag doch mal nach.

Davon mal abgesehen hilft's eh nicht, wenn man von Allzweckrgistern
ausgeht, und das Ergebnis wieder in einem Allzweckregister haben will.

Gruss

Jan Bruns
Sebastian Biallas
2006-05-22 19:10:02 UTC
Permalink
Post by Jan Bruns
Post by Sebastian Biallas
Post by Hipo
Gibt es grundsätzlich einen Assemblerbefehl (64 bit Plattform), der es
erlaubt Daten eines Register zu "komprimieren", und zwar nach folgendem
RAX: 0xAF650B76
RBX: 0xF0F0F0F0
RAX stellt dabei meine Daten dar, in RBX liegt eine Bitmaske, mit Hilfe
von AND wird die Hälfte von RAX eliminiert. Was in RAX übrig bleibt ist
0xA0600070. Ich möchte jetzt die 0en zwischen den Werten eliminieren.
Dafür gibt es MMX bzw SSE-Befehle (packXXX), die die komplette Operation
übernehmen.
Ist gut, daß Du's erwähnst. Aber ich meine doch, daß bei MMX
die kleinste Verarbeitungseinheit das Byte ist.
Urgs, ja. Ich war gedanklich bei Bytes, weil man sowas "normalerweise"
nur mit Bytes macht :)
Post by Jan Bruns
Für SSE weiß ich
gerade nicht, schlag doch mal nach.
Davon mal abgesehen hilft's eh nicht, wenn man von Allzweckrgistern
ausgeht, und das Ergebnis wieder in einem Allzweckregister haben will.
Ich habe das dumpfe Gefühl, dass der OP sowieso MMX/SSE verwenden will,
wenn er so Operationen (in schnell) braucht.
--
Gruß,
Sebastian
Hipo
2006-05-23 08:36:14 UTC
Permalink
Danke euch allen, hat mir sehr geholfen.

Ich wollte noch fragen, ob mir jemand eine gute Einführung in ML64 (MASM
für x64) empfehlen kann?


mfg, hipo

Lesen Sie weiter auf narkive:
Loading...