PDA

Ver la Versión Completa : Convertir código "asm" a código Delphi


dec
07-08-2016, 19:05:37
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:


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, 20: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, 14: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/pyscripter/blob/master/SynHighlighterWeb.pas

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, 15:41:34
Hola bucanero,

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/pyscripter/blob/master/SynHighlighterWeb.pas

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, 21:09:58
Hola. No conocozco las peculiaridades de Delphi (realmente no conozco practicamente nada de Delphi) pero, ¿no serviria algo asi?:
mov rcx, APos https://software.intel.com/en-us/articles/introduction-to-x64-assembly
https://msdn.microsoft.com/en-us/library/windows/hardware/ff561499(v=vs.85).aspx