Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler beim Byte-Swap mit Assembler in Delphi (https://www.delphipraxis.net/48884-fehler-beim-byte-swap-mit-assembler-delphi.html)

Neutral General 28. Feb 2012 09:26

AW: Fehler beim Byte-Swap mit Assembler in Delphi
 
Das sollte unter 64 Bit ganz genauso funktionieren.

x000x 28. Feb 2012 09:40

AW: Fehler beim Byte-Swap mit Assembler in Delphi
 
Danke Michael,

aber kannst du mir noch kurz sagen warum das so ist? Weil nach meiner "Vorstellung" sollte es doch so sein:
Code:
//32bit
00 00 00 01
=> BSWAP EAX
01 00 00 00

//64bit
00 00 00 00 00 00 00 01
=> BSWAP EAX
01 00 00 00 00 00 00 00
Oder ist EAX immer 4 Bytes, auch bei einem 64bit System? (Sorry für die eventuell blöde Frage, aber ich habe mich bisher um sowas noch nicht kümmern müssen)

himitsu 28. Feb 2012 09:44

AW: Fehler beim Byte-Swap mit Assembler in Delphi
 
AL und AH = 8 Bit Register
AX = 16 Bit Register
EAX = 32 Bit Register
RAX = 64 Bit Register

Und nun die Frage: Funktioniert EAX auch mit einem 64 Bit-Wert? :roll:
(mit 32 Bit-Wert auf 64 Bit-CPU wird es bestimmt funktionieren)

Neutral General 28. Feb 2012 10:36

AW: Fehler beim Byte-Swap mit Assembler in Delphi
 
Wobei (um himitsus Beitrag noch zu ergänzen)

alle Register (also A,B,C,D) eigentlich nur 1 großes sind:

AH + AL = AX
AX = die unteren 16 Bit von EAX
EAX = die unteren 32 Bit von RAX

Das gleiche gilt für RBX, RCX, RDX.

Code:
-----------RAX-----------
            |----EAX-----
            |     |--AX--
|  |  |  |  |  |  |AH|AL|

x000x 29. Feb 2012 08:24

AW: Fehler beim Byte-Swap mit Assembler in Delphi
 
Moin moin,

erstmal danke für eure Erklärungen. Ich konnte es gestern Abend noch unter einem XE2 testen. Wenn ich allerdings eine x64 Version erstellt habe und diese auf einer x64 CPU ausführe, funktioniert es nicht wie gewünscht.

Ursache ist wohl, dass bei 64bit der Wert DW nicht in EAX übergeben wird, sondern in ECX. (Falls diese Erklärung falsch ist, dann korrigiert mich)
Delphi-Quellcode:
function SwapDWord(DW: DWord): DWord;
asm
{$IFDEF CPUX64}
   MOV   EAX, ECX
{$ENDIF CPUX64}
   BSWAP EAX
end;
So hat es jedenfalls auf 32bit wie auch auf 64bit funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz