Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Visual Studio Intrinsic für "Kompression" eines Registers

1 view
Skip to first unread message

Hipo

unread,
May 22, 2006, 4:45:37 AM5/22/06
to
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

unread,
May 22, 2006, 1:58:10 PM5/22/06
to

"Hipo":

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

unread,
May 22, 2006, 2:33:11 PM5/22/06
to
Hipo wrote:
> 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.

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

unread,
May 22, 2006, 2:52:52 PM5/22/06
to

"Sebastian Biallas":

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

unread,
May 22, 2006, 3:10:02 PM5/22/06
to
Jan Bruns wrote:
> "Sebastian Biallas":
>>> 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.
>
>> Welches Ergebnis willst Du haben? 0xa67 oder 0xa607? Falls letzteres:
>> 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 :)

> 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

unread,
May 23, 2006, 4:36:14 AM5/23/06
to
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

0 new messages