Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#3

Re: Fehler beim Byte-Swap mit Assembler in Delphi

  Alt 1. Jul 2005, 21:48
Delphi-Quellcode:
function SwapDWord(DW: DWord): DWord;
asm
  bswap eax // Byte-Swap durchführen
end;
Viel Spaß

Und wenn wir schon dabei sind: [DW] wäre die Adresse auf welche DW zeigt. Und zwar das DWORD an dieser Stelle, weil der Zieloperand die Größe vorgibt

Ach ja und Delphi 4 kennt z.B. noch nicht BSWAP. Da heißt es dann:

Delphi-Quellcode:
function SwapDWord(DW: DWord): DWord;
asm
  db 0Fh, 0C8h // "bswap EAX" can only be executed on 486+!!!
end;
So habe ich es bei der Native API-Unit der JEDIs gelöst:
Delphi-Quellcode:
(* Own function to swap bytes in 32bit values

  The RtlUlongByteSwap routine converts a ULONG from little-endian to
   big-endian, and vice versa. *)

function RtlUlongByteSwap(Source:ULONG):ULONG;
asm
  // This is not written as mnemonics to be compatible with D4!
  db 0Fh, 0C8h // "bswap EAX" can only be executed on 486+!!!
(*
// Does the same but perhaps slower ...
                        // Source = $11223344
  rol  AX,  08h        // Source = $11224433
  rol  EAX, 0Fh        // Source = $44331122
  rol  AX,  08h        // Source = $44332211
*)

end;
  Mit Zitat antworten Zitat