Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   ASM y Microcontroladores (https://www.clubdelphi.com/foros/forumdisplay.php?f=44)
-   -   Convertir código "asm" a código Delphi (https://www.clubdelphi.com/foros/showthread.php?t=90665)

dec 07-08-2016 20:05:37

Convertir código "asm" a código Delphi
 
Hola a todos,

Estoy tratando de compilar uno de mis programas para Windows de 64 bits, y, me encuentro conque en cierto código de terceros se hace uso de cierto método que a su vez usa código "asm", que, no puede compilarse para 64 bits. Se trata de dos líneas de código "asm", pero, bastan y aún sobran para verme en la necesidad de pedir vuestra ayuda. A continuación copio y pego el método en cuestión, con un comentario escrito por el propio desarrollador:

Código Delphi [-]
procedure TSynWebEngine.SetRangeInt(ALen, APos, AVal: Longword);
var
  i: Longword;
begin
  i := $FFFFFFFF shl ALen;
  //todo: Does it work in CLX? Should be [EBX].APos? I don't know :(
  asm
    mov ecx, APos
    rol i, cl
  end;
  FInstance^.FRange := (FInstance^.FRange and i) or ((AVal shl APos) and not i);
end;

¿Puede alguien echarme una mano a convertir dicho código "asm" a código Delphi?

Muchas gracias de antemano. :)

dec 07-08-2016 21:16:31

Hola a todos,

Sigue siendo interesante una posible solución a lo dicho arriba, pero, acabo de probar una compilación para 64 bits de mi programa y esta no arranca siquiera. Definitivamente, necesitaría que mi entorno de trabajo fuese ya usando un Windows de 64 bits, pero, puesto que no es así, mucho me temo que aquí tengo que dejar este intento por portar mis programas a dicha plataforma. Al menos de momento, puesto que la idea sería cambiar, en un futuro, mi propio ordenador a un Windows de 64 bits y trabajar desde ahí.

¡Queda dicho! :)

bucanero 08-08-2016 15:47:22

Hola DEC,

Buscando por el nombre de la función en google, aparece en github una versión mas actualizada en donde el autor ya parece tener resuelto el problema

https://github.com/pyscripter/pyscri...lighterWeb.pas

Código Delphi [-]
procedure TSynWebEngine.SetRangeInt(ALen, APos, AVal: Longword);
var
  i: Longword;
begin
  i := $FFFFFFFF shl ALen;
  //todo: Does it work in CLX? Should be [EBX].APos? I don't know :(
  {$IFDEF CPUX64}
  i:= (i shl APos) or (i shr (32-APos));
  {$ELSE}
  asm
    mov ecx, APos
    rol i, cl
  end;
  {$ENDIF}
  FInstance^.FRange := (FInstance^.FRange and i) or ((AVal shl APos) and not i);
end;

Espero te sirva
Un saludo

dec 08-08-2016 16:41:34

Hola bucanero,

Cita:

Empezado por bucanero (Mensaje 507489)
Hola DEC,

Buscando por el nombre de la función en google, aparece en github una versión mas actualizada en donde el autor ya parece tener resuelto el problema

https://github.com/pyscripter/pyscri...lighterWeb.pas

Código Delphi [-]
procedure TSynWebEngine.SetRangeInt(ALen, APos, AVal: Longword);
var
  i: Longword;
begin
  i := $FFFFFFFF shl ALen;
  //todo: Does it work in CLX? Should be [EBX].APos? I don't know :(
  {$IFDEF CPUX64}
  i:= (i shl APos) or (i shr (32-APos));
  {$ELSE}
  asm
    mov ecx, APos
    rol i, cl
  end;
  {$ENDIF}
  FInstance^.FRange := (FInstance^.FRange and i) or ((AVal shl APos) and not i);
end;

Espero te sirva
Un saludo

Hombre, muchísimas gracias. ¡Ahora mismo voy a echar un vistazo! :)

exmachina 09-12-2016 22:09:58

Hola. No conocozco las peculiaridades de Delphi (realmente no conozco practicamente nada de Delphi) pero, ¿no serviria algo asi?:
Código:

mov rcx, APos
https://software.intel.com/en-us/art...o-x64-assembly
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx


La franja horaria es GMT +2. Ahora son las 13:45:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi