pentium language instruction delphi assembly x86-64 fpu basm

delphi - language - list of x86 instructions



Instrucción FLD x64 bit (2)

Tengo un pequeño problema con la instrucción FLD en x64 bit ... quiero cargar el valor Double en la FPU del puntero de pila en el registro st0, pero parece ser imposible. En Delphi x32, puedo usar este código:

function DoSomething(X:Double):Double; asm FLD X // Do Something .. FST Result end;

Desafortunadamente, en x64, el mismo código no funciona.


Delphi hereda la Convención de llamadas de Microsoft x64 . Por lo tanto, si los argumentos de función / procedimiento son flotante / doble, se pasan en los registros XMM0L, XMM1L, XMM2L y XMM3L.

Pero puede usar var before parameter como una solución alternativa como:

function DoSomething(var X:Double):Double; asm FLD qword ptr [X] // Do Something .. FST Result end;


En el modo x64, los parámetros de coma flotante se pasan en xmm-registers. Entonces, cuando Delphi intenta compilar FLD X, se convierte en FLD xmm0 pero no hay tal instrucción. Primero debe moverlo a la memoria.

Lo mismo ocurre con el resultado, se debe pasar de nuevo en xmm0.

Pruebe esto (no probado):

function DoSomething(X:Double):Double; var Temp : double; asm MOVQ qword ptr Temp,X FLD Temp //do something FST Temp MOVQ xmm0,qword ptr Temp end;