Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Uso de ASM en 64 bits (https://www.clubdelphi.com/foros/showthread.php?t=89872)

xangiesaurx 22-02-2016 18:58:34

Uso de ASM en 64 bits
 
Hola que tal a todos, vengo con otra duda, tengo este código en mi código de Delphi de 32bits, pero ahora que estoy compilando en 64bits con Delphi XE5, me da errores, me preguntaba si alguno de ustedes podría ayudarme con esto.
Muchas gracias :)

Código:

function FastCpySSE(const D:Pointer; const S:Pointer; const count:dword):integer;
var dwNumElements, dwNumPacks:DWORD;
begin
 dwNumElements := count div sizeof(integer);
 // not really using it, just for debuging. it keeps number of looping.
 // it also means number of packed data.
 dwNumPacks := dwNumElements div (128 div (sizeof(integer)*8));

 asm
  // remember for cleanup
  pusha;
@@begin:
  // init counter to SizeInBytes
  mov  ecx,count
  // get destination pointer
  mov  edi,D
  // get source pointer
  mov  esi,S
@@begina:
  // check if counter is 0, yes end loop.
  cmp  ecx,0
  jz  @@end
@@body:
  // calculate offset
  mov  ebx,count
  sub  ebx,ecx
  // copy source's content to 128 bits registers
  movdqa xmm1,[esi+ebx]
  // copy 128 bits registers to destination
  movdqa [edi+ebx],xmm1;

@@bodya:
  // we've done "1 packed == 4 * sizeof(int)" already.
  sub  ecx,16;
  jmp  @@begina
@@end:
  // cleanup
  popa;
end;

 result := 0;;
end;


Casimiro Noteví 22-02-2016 19:19:51

Cita:

Empezado por xangiesaurx (Mensaje 502423)
me da errores

:rolleyes::rolleyes::rolleyes:

xangiesaurx 22-02-2016 19:38:35

Sorry, crei que si los había puesto xD
Estos son los errores que me da Delphi

[dcc64 Error] MemMgr.pas(141): E1025 Unsupported language feature: 'ASM'
[dcc64 Error] MemMgr.pas(141): E2029 ';' expected but 'ASM' found
[dcc64 Error] MemMgr.pas(143): E2003 Undeclared identifier: 'pusha'
[dcc64 Error] MemMgr.pas(146): E2003 Undeclared identifier: 'count'
[dcc64 Error] MemMgr.pas(148): E2003 Undeclared identifier: 'D'
[dcc64 Error] MemMgr.pas(150): E2003 Undeclared identifier: 'S'
[dcc64 Error] MemMgr.pas(170): E2003 Undeclared identifier: 'popa'
[dcc64 Error] MemMgr.pas(171): E2029 '.' expected but ';' found
[dcc64 Error] MemMgr.pas(32): E2065 Unsatisfied forward or external declaration: 'SmartCpy64'
[dcc64 Error] MemMgr.pas(33): E2065 Unsatisfied forward or external declaration: 'SmartFill64'
[dcc64 Error] MemMgr.pas(34): E2065 Unsatisfied forward or external declaration: 'SmartFill32'
[dcc64 Error] MemMgr.pas(35): E2065 Unsatisfied forward or external declaration: 'FillChar32'
[dcc64 Fatal Error] MemBitmap.pas(5): F2063 Could not compile used unit 'MemMgr.pas'

roman 22-02-2016 19:45:33

Creo que esto te puede dar una idea:

http://docwiki.embarcadero.com/RADSt..._Assembly_code

Básicamente, en 64 bits ya no puedes tener rutinas con código mezclado: o todo es delphi o todo es ensamblador.

LineComment Saludos

xangiesaurx 23-02-2016 00:29:34

Cita:

Empezado por roman (Mensaje 502436)
Creo que esto te puede dar una idea:

http://docwiki.embarcadero.com/RADSt..._Assembly_code

Básicamente, en 64 bits ya no puedes tener rutinas con código mezclado: o todo es delphi o todo es ensamblador.

LineComment Saludos

Ya lo eh revisado, pero incluso tomando en cuenta lo que se muestra en el documento, me siguen saliendo los mismos errores

AgustinOrtu 23-02-2016 03:52:55

Traduciste el codigo a pascal?

xangiesaurx 23-02-2016 18:33:12

Aun no hago la traducción a Pascal, me piden que conserve ensamblador y que si hay forma de hacerlo, pero eso es lo que aun no puedo lograr

AgustinOrtu 23-02-2016 19:12:25

Es una limitacion del lenguaje

Delphi no te va a dejar escribir codigo ASM en Win64 bits

O lo traduces a Pascal, o compilas en 32 bits

xangiesaurx 23-02-2016 19:13:59

Ok, tendré que empezar a traducirlo a pascal, muchas gracias.

roman 23-02-2016 19:40:15

Cita:

Empezado por AgustinOrtu (Mensaje 502501)
Es una limitacion del lenguaje

Delphi no te va a dejar escribir codigo ASM en Win64 bits

O lo traduces a Pascal, o compilas en 32 bits

Lo que dice el enlace que puse es que no puedes mezclar código delphi con ensamblador. No dice que no puedas tener código asm en 64 bits.

LineComment Saludos

xangiesaurx 23-02-2016 19:54:03

Cita:

Empezado por roman (Mensaje 502508)
Lo que dice el enlace que puse es que no puedes mezclar código delphi con ensamblador. No dice que no puedas tener código asm en 64 bits.

LineComment Saludos

Si había visto eso y sigo probando, pero por más que lo intento no me deja, me marca error en la linea donde indico que es ensamblador (asm).

roman 23-02-2016 19:57:57

Entre el begin y el asm tienes código delphi y yo supongo que éso es lo que no se puede hacer.

LineComment Saludos

xangiesaurx 23-02-2016 20:05:22

Cita:

Empezado por roman (Mensaje 502510)
Entre el begin y el asm tienes código delphi y yo supongo que éso es lo que no se puede hacer.

LineComment Saludos

Oks, modificare esa parte y ya les aviso como me fue :)

AgustinOrtu 23-02-2016 20:08:22

Auch, tenés razón roman, no hay problema con usar ASM en 64 bits, lo que no se puede es mezclar

xangiesaurx 01-03-2016 23:32:51

Hola chicos, disculpen la tardanza en contestar, pude resolver el problema, como había comentado roman, tuve que traducirlo y quedo en una simple línea de código:

CopyMemory(D, S, count);

El problema es que ahora me aparece el siguiente error:

[dcc64 Error] JPG.pas(1091): E2045 Bad object file format: 'D:\Development\Library\Library\GraphicEx\jdapimin.obj'

Alguien sabría a que se debe?
gracias :)

AgustinOrtu 02-03-2016 05:28:43

Esta es apenas la poca documentacion que he encontrado, a ver si te sirve

xangiesaurx 02-03-2016 19:02:13

Gracias AgustinOrtu, justo era lo que estaba viendo ayer, pero revisando el proyecto, no encuentro algun error relacionado a lo que aparece en la lista, no se a que mas se pueda deber esto :(

xangiesaurx 15-03-2016 18:18:16

Que tal chicos, la verdad, no se me da nada ensamblador, me cuesta mucho entenderle, entonces me preguntaba si me podrian ayudar a traducir algunas partes a código para Delphi please?

Como este:
asm
PUSH EBX
LEA EBX, ReverseTable
MOV ECX, [PackedSize]
MOV EDX, [Source]
MOV EDX, [EDX]
@@1:
MOV AL, [EDX]
{$ifdef COMPILER_6}
XLATB
{$else}
XLAT
{$endif COMPILER_6}
MOV [EDX], AL
INC EDX
DEC ECX
JNZ @@1
POP EBX
end;

Gracias :)


La franja horaria es GMT +2. Ahora son las 01:18:10.

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