User CPFAQMembers ListCalendarToday's PostsSearch




Go Back   Foonews.Net > Newsgroups de.* > de.comp.* > de.comp.lang.assembler.x86

Prova Gratis 30gg l'hosting fooweb
Reply
 
LinkBack Thread Tools Display Modes
 
Old 23-05-06, 02:16 PM
Hipo
 
Posts: n/a
Default Rotation in einem Register

Hi.
Ich hab noch ein Problem, auf dessen Lösung ich einfachnicht komme.
Ich habe 8 Bytes in einem Register, z.B. RAX. Sie sind wie folgt
angeordnet:

|a b c d e f g h|

Mein Ziel ist es, das Register am Schluss so ausehen zu lassen:

|c d a b g h e f|

Ich muss also die hohen und die niedrigen Byte voneinander unabhängig
rotieren.
Meine Lösung wäre:

ROTL EAX, 16
ROTL RAX, 32
ROTL EAX, 16
ROTL RAX, 32

Ich finde das nicht elegant, und sicherlich nicht sher effizient, da ich
diese Berechnung sehr oft durchlaufen muss.

Hat vielleicht jemand einen Trick auf Lager, der diese Operation
effizienter erledigen kann?

mfg, Hipo
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 23-05-06, 03:41 PM
Sebastian Biallas
 
Posts: n/a
Default Re: Rotation in einem Register

Hipo wrote:
> Hi.
> Ich hab noch ein Problem, auf dessen Lösung ich einfachnicht komme.
> Ich habe 8 Bytes in einem Register, z.B. RAX. Sie sind wie folgt
> angeordnet:
>
> |a b c d e f g h|
>
> Mein Ziel ist es, das Register am Schluss so ausehen zu lassen:
>
> |c d a b g h e f|
>
> Ich muss also die hohen und die niedrigen Byte voneinander unabhängig
> rotieren.
> Meine Lösung wäre:
>
> ROTL EAX, 16


Das löscht den oberen Teil von RAX. Hast Du das überhaupt ausprobiert?

> Hat vielleicht jemand einen Trick auf Lager, der diese Operation
> effizienter erledigen kann?


pshufw

Ansonsten würde ich den Wert in EDX:EAX speichern. Was versuchst Du da
eigentlich zu erreichen?

--
Gruß,
Sebastian
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Try the foonews Toolbar!!!
 
Old 23-05-06, 03:56 PM
Hipo
 
Posts: n/a
Default Re: Rotation in einem Register

Sebastian Biallas schrieb:
> Hipo wrote:
>> Hi.
>> Ich hab noch ein Problem, auf dessen Lösung ich einfachnicht komme.
>> Ich habe 8 Bytes in einem Register, z.B. RAX. Sie sind wie folgt
>> angeordnet:
>>
>> |a b c d e f g h|
>>
>> Mein Ziel ist es, das Register am Schluss so ausehen zu lassen:
>>
>> |c d a b g h e f|
>>
>> Ich muss also die hohen und die niedrigen Byte voneinander unabhängig
>> rotieren.
>> Meine Lösung wäre:
>>
>> ROTL EAX, 16

>
> Das löscht den oberen Teil von RAX. Hast Du das überhaupt ausprobiert?


Ich bin noch in der Planungsphase. Ich hätte es gern ausprobiert, aber
VS 2005 für x64 unterstützt keinen inline assembler. Bisher hatte ich
noch keine Zeit reinen Assembler code zu schreiben, wobei ich mich da
erst einlesen muss, da ich es noch nicht verwerendet hab.

>> Hat vielleicht jemand einen Trick auf Lager, der diese Operation
>> effizienter erledigen kann?

>
> pshufw


Kannst du mir aus Erfahrung sagen, wie sehr die Performance unter
Datentransfers zwischen XMM und GPR Register leidet. Ich habe
diesbezüglich bereits einige Warnungen erhalten.
>
> Ansonsten würde ich den Wert in EDX:EAX speichern. Was versuchst Du da
> eigentlich zu erreichen?


Für einen Teil eines Verschlüsselungsalgorithmus muss ich oben
beschriebene Permutationen durchführen.

mfg, Hipo
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 23-05-06, 04:11 PM
Sebastian Biallas
 
Posts: n/a
Default Re: Rotation in einem Register

Hipo wrote:
>> pshufw

>
> Kannst du mir aus Erfahrung sagen, wie sehr die Performance unter
> Datentransfers zwischen XMM und GPR Register leidet. Ich habe
> diesbezüglich bereits einige Warnungen erhalten.


Wahrscheinlich zu recht. Besser ist es, alles mit MMX/SSE zu machen.

--
Gruß,
Sebastian
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 02:21 AM
Jan Bruns
 
Posts: n/a
Default Re: Rotation in einem Register


"Hipo":
> Ich hab noch ein Problem, auf dessen Lösung ich einfachnicht komme.
> Ich habe 8 Bytes in einem Register, z.B. RAX. Sie sind wie folgt
> angeordnet:


> |a b c d e f g h|


> Mein Ziel ist es, das Register am Schluss so ausehen zu lassen:
>
> |c d a b g h e f|



Also mal in 32-Bit Schreibweise (für 64 Bit lässt sich das sicherlich
einfach erweitern):

; "eax=a,b,c,d -> eax=c,d,a,b"
mov ebx,eax
and eax,$FFFF0000
and ebx,$0000FFFF
shr eax,16
shl ebx,16
or eax,ebx

oder einfach:

; "eax=a,b,c,d -> eax=c,d,a,b"
rol eax,16

letzteres is so natürlich nicht auf 64-Bit übertragbar.

Gruss

Jan Bruns

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 02:27 AM
Jan Bruns
 
Posts: n/a
Default Re: Rotation in einem Register

"Sebastian Biallas":
> Hipo wrote:


>> ROTL EAX, 16


> Das löscht den oberen Teil von RAX. Hast Du das überhaupt ausprobiert?


Wie heisst denn in dieser neumodischen 64-Bit Technik der Befehl
für Rotation? Gab doch schon immer rot und shift, mit und ohne Carry.

Grussauch

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 02:58 AM
Sebastian Biallas
 
Posts: n/a
Default Re: Rotation in einem Register

Jan Bruns wrote:
> "Sebastian Biallas":
>> Hipo wrote:

>
>>> ROTL EAX, 16

>
>> Das löscht den oberen Teil von RAX. Hast Du das überhaupt ausprobiert?

>
> Wie heisst denn in dieser neumodischen 64-Bit Technik der Befehl
> für Rotation?


Weiterhin rol bzw. ror usw, das da oben ist wahrscheinlich ein
Tippfehler. Es hat sich von 32->64 am Befehlssatz eigentlich kaum was
geändert. Ein paar Befehle sind rausgeflogen, hinzu kam eigentlich nur
movsxd, ein neuer Adressierungsmodus (IP-relativ), ein bissl SSE-Kram
und esoterisches. Und man hat halt doppelt so viele Register.

Man sollte halt nur wissen, dass beim Zugriff auf ein Teilregister immer
die oberen 32 Bit gelöscht werden.

Die Aufgabe des OP ist für ein 64 Bit Register wohl nicht so einfach,
deshalb mein Vorschlag, auf zwei 32 Bit Register auszuweichen.

--
Gruß,
Sebastian
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 03:22 AM
Jan Bruns
 
Posts: n/a
Default Re: Rotation in einem Register


"Sebastian Biallas":

> Man sollte halt nur wissen, dass beim Zugriff auf ein Teilregister immer
> die oberen 32 Bit gelöscht werden.


Das muss ich bei Gelegenheit mal nachschlagen...

Ist ja bisher auch anders gewesen:

mov eax,$12345678
mov ax, $5678
mov al, $78

-> eax = $12345678

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 11:55 AM
Sebastian Biallas
 
Posts: n/a
Default Re: Rotation in einem Register

Jan Bruns wrote:
> "Sebastian Biallas":
>
>> Man sollte halt nur wissen, dass beim Zugriff auf ein Teilregister immer
>> die oberen 32 Bit gelöscht werden.

>
> Das muss ich bei Gelegenheit mal nachschlagen...
>
> Ist ja bisher auch anders gewesen:
>
> mov eax,$12345678
> mov ax, $5678
> mov al, $78
>
> -> eax = $12345678


Das gilt auch weiterhin. Allerdings gilt danach (rax&0xffffffff00000000)==0.

Das ist aber auch sinnvoll so. Obiges Verhalten war vor 20 Jahren
vielleicht noch verständlich, ist aber für heutige Prozessoren sehr
schlecht, weil man mit den partial register stalls umgehen muss.

Bei dem "mov al, $78" muss der Prozessor entweder auf den Wert von rax
warten, bis er den Befehl zuende ausführen kann, oder er zerteilt das
Register und muss es später u.U. wieder kompliziert zusammenführen. Ein
"mov eax, $78" hingegen kann er unabhängig von dem vorigen Wert von rax
ausführen.

Schau Dir mal Code vom einem aktuellen Compiler an, der mit Bytes
handtiert (z.B. Stringverarbeitung). Der ist voll von scheinbar
unnötigen movzx/movsx. Das macht man halt, um dem Prozessor Arbeit
abzunehmen.

--
Gruß,
Sebastian
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
 
Old 24-05-06, 06:27 PM
Jan Bruns
 
Posts: n/a
Default Re: Rotation in einem Register


"Sebastian Biallas":
> Jan Bruns wrote:
>> "Sebastian Biallas":


>> mov eax,$12345678
>> mov ax, $5678
>> mov al, $78


>> -> eax = $12345678


> Das gilt auch weiterhin. Allerdings gilt danach (rax&0xffffffff00000000)==0.


Naja, interessiert mich momentan nicht hinreichend, um das nachzuschlagen.
Jedenfalls: Ziemlich inkonsequent sieht das aus.

> Das ist aber auch sinnvoll so. Obiges Verhalten war vor 20 Jahren
> vielleicht noch verständlich, ist aber für heutige Prozessoren sehr
> schlecht, weil man mit den partial register stalls umgehen muss.


Also ich kann nun nicht gerade behaupten, über die pipelinetechnsichen
Hintergründe bzgl. partieller Register genauestens informiert zu sein.
Klingt für mich eigentlich eher nach Integrationsdichte, als nach
echten Engpässen.

> Bei dem "mov al, $78" muss der Prozessor entweder auf den Wert von rax
> warten, bis er den Befehl zuende ausführen kann, oder er zerteilt das
> Register und muss es später u.U. wieder kompliziert zusammenführen. Ein
> "mov eax, $78" hingegen kann er unabhängig von dem vorigen Wert von rax
> ausführen.


Der Prozessor muss auf rax warten? Wo ist denn rax implementiert?

Du meinst wahrscheinlich einfach irgendeine zentrale Verarbeitungseinheit
in der CPU. Dazu ist einfach mal festzustellen, daß es neben schematischen
Trennung von Befehlausführung und Registersatz auch völlig andere
Implementationen denkbar sind. Bspw. könnte man für jedes Register
eine eigene Ausführungseinheit vorsehen, um dann nur noch Datentransfers
zwischen Registern bzw. externem Speicher zentralisiert organisieren zu
müssen. In Anbetracht der "aktuellen" Problematik weiterhin schnell
steigende(r) Integrationsumfang/dichte bei geringem Taktratenzuwachs
vielleicht nichtmal eine völlig absurde Vorgehensweise.

> Schau Dir mal Code vom einem aktuellen Compiler an, der mit Bytes
> handtiert (z.B. Stringverarbeitung). Der ist voll von scheinbar
> unnötigen movzx/movsx. Das macht man halt, um dem Prozessor Arbeit
> abzunehmen.


Also Du meinst den Zusammenhang, daß obwohl nur bspw. vereinzelte
Bytes zu verarbeiten sind (von denen mehrere in einem Register
gespeichert werden könnten), in der Praxis trotzdem regelmässig nur
eine Dateneinheit pro Register verwendet wird, und dabei denn auch
unnötig häufig die nicht verwendeten Anteile explizit überschrieben
werden?

Das hat vielleicht verschiedene Ursachen, aber einer davon ist
sicherlich memory alignment. Wenn es dagegen darum geht, bspw.
den Befehl "mov al,bl" CPU-optimiert zu schreiben, kam da
bislang regelmässig sowas wie "mov eax,ebx" heraus, wenn die
oberen Anteile von ebx eh' trivial sind, obwohl die Formulierung
"movzx eax,bl" sicherlich einfacher ist.

Gruss

Jan Bruns


Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



 RSS Feeds - Archive - Top




All times are GMT +1. The time now is 10:22 PM. Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 Forum style by ForumMonkeys.com.