divpd无法识别的操作码x64

时间:2014-06-27 20:39:41

标签: delphi assembly freepascal

我为矩阵操作创建了一个非常好的汇编程序库,最初用于Delphi 2007 +。

这段代码在Delphi下工作得很好,所以我也想支持Freepascal,直到我在一行上遇到汇编语法错误时才走得很远:

divdp xmm1,[r9 + rax - 112];

Freepascal(实际上是Lazaraus)报告错误: 无法识别的操作编码DIVP

我有点疑惑,因为这是一个标准的汇编程序指令...... 任何人都知道我如何“教”Freepascal来理解这种类型的指令?

(注意我不想引入任何db指令......)

1 个答案:

答案 0 :(得分:10)

汇编代码在新系统上运行总是很棘手。

首先,Delphi使用Intel x86汇编语法,其中寄存器名称为rax和xmm1;而freepascal默认使用GNU / AT& T语法,其中操作数列在目标末尾,寄存器名称则像%rax和%xmm1一样进行装饰。如果您更喜欢Intel语法,可以通过添加" -Rintel"来切换默认语法。到fpc命令行,或将asmmode intel指令添加到源代码文件的顶部:

{$ASMMODE INTEL}

其次,divpd是SSE2指令,因此您可能需要启用SSE作为编译器" FPU指令集"。这似乎是我的fpc 2.6.2 64位安装的默认设置,但是您可能需要将"-Cfsse3" flag添加到fpc命令行的其他计算机。

此SSE内联汇编在我的freepascal编译器上使用默认标志。

{$ASMMODE INTEL}
Program ssedemo;   
var
  X: int32;

Begin    
 Writeln('Starting SSE now:');

 asm
   MOV EAX,40
   CVTSI2SD XMM1,EAX
   MOV ECX,10
   CVTSI2SD XMM2,ECX

   DIVSD XMM1,XMM2

   CVTSD2SI EAX,XMM1
   MOV X,EAX
 end;

 Writeln(X);

End.