Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   64bit asm (https://www.delphipraxis.net/175455-64bit-asm.html)

mb1996 22. Jun 2013 10:55

64bit asm
 
Hallo Leute,
wie kann man diesen Win32 ASM-Code in WIn64 übersetzten?

Delphi-Quellcode:
function TPRNG.random: Double;
const  Minus32: double = -32.0;
asm
  CALL   genrand_MT19937
  PUSH   0
  PUSH   EAX
  FLD    Minus32
  FILD   qword ptr [ESP]
  ADD    ESP,8
  FSCALE
  FSTP   ST(1)
end;

Horst0815 22. Jun 2013 13:20

AW: 64bit asm
 
Anpassen der Register sollte reichen

EAX->RAX
ESP->RSP

jbg 22. Jun 2013 14:34

AW: 64bit asm
 
Zitat:

Zitat von Horst0815 (Beitrag 1219446)
Anpassen der Register sollte reichen

So einfach ist das nicht. Denn die 32bit Funktion hat das Ergebnis im TOS zurückgegeben, bei 64bit muss es aber im RAX Register zurückgegeben werden. Zudem wird die FPU eigentlich unter Win64 nicht mehr genutzt, da alle Gleitkommazahlen über SSE abgehandelt werden.

gammatester 24. Jun 2013 08:20

AW: 64bit asm
 
Warum muß es denn unbedingt Assembler sein?
Delphi-Quellcode:
function TPRNG.random: Double;
begin
  Result := genrand_MT19937/4294967296.0;
end;
macht doch wohl genau das, was Du brauchst. Wenn's dann noch mit inline deklariert wird, ist es eventuell sogar schneller als eine asm-Funktion. Falls genrand_MT19937 ein longint liefert, mußt Du halt noch ein DWORD/cardinal/longword-Typecast einstreuen:
Delphi-Quellcode:
Result := longword(genrand_MT19937)/4294967296.0


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr.

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