我为矩阵操作创建了一个非常好的汇编程序库,最初用于Delphi 2007 +。
这段代码在Delphi下工作得很好,所以我也想支持Freepascal,直到我在一行上遇到汇编语法错误时才走得很远:
divdp xmm1,[r9 + rax - 112];
Freepascal(实际上是Lazaraus)报告错误: 无法识别的操作编码DIVP
我有点疑惑,因为这是一个标准的汇编程序指令...... 任何人都知道我如何“教”Freepascal来理解这种类型的指令?
(注意我不想引入任何db指令......)
答案 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.