Delphi 需要帮助将x86 ASM转换为x64吗
我有一个库,它为一些函数使用汇编代码,我想在x64上编译它,当然是抛出错误。有人能帮我纠正一下吗(甚至解释一下为什么这些函数是用ASM编写的)Delphi 需要帮助将x86 ASM转换为x64吗,delphi,assembly,x86,x86-64,32bit-64bit,Delphi,Assembly,X86,X86 64,32bit 64bit,我有一个库,它为一些函数使用汇编代码,我想在x64上编译它,当然是抛出错误。有人能帮我纠正一下吗(甚至解释一下为什么这些函数是用ASM编写的) 最谦虚的感谢 我认为没有理由在汇编程序中实现这些函数。现代的Delphi编译器应该能够很好地生成相同的代码。但是,我对Pascal或Delphi不太熟悉,所以我不太愿意写一个答案。我看不出你为什么要用asm手工写第一个答案。这太可怕了,就像用SSE3 FISTTP或SSE2CVTTSS2SI eax,xmm0手工编写asm试图避免的那种情况。鉴于SSE
最谦虚的感谢 我认为没有理由在汇编程序中实现这些函数。现代的Delphi编译器应该能够很好地生成相同的代码。但是,我对Pascal或Delphi不太熟悉,所以我不太愿意写一个答案。我看不出你为什么要用asm手工写第一个答案。这太可怕了,就像用SSE3 FISTTP或SSE2
CVTTSS2SI eax,xmm0手工编写asm试图避免的那种情况。鉴于SSE math(x86-64的默认值)直接支持截断转换,我希望比任何编译器都知道如何使用它,但请检查asm。(使用cvtss2si
进行非截断转换,这在C语言中是不容易访问的;您必须手持编译器内联lrint(x)或(int)rint(x)
并优化开销;IDK关于Delphi)奇怪的问题。使用具有相同名称的RTL函数。@PeterCordes,我也在想同样的问题,但是想到了一些优化的原因。我很乐意删除它们:-)我认为没有理由在汇编程序中实现这些函数。现代的Delphi编译器应该能够很好地生成相同的代码。但是,我对Pascal或Delphi不太熟悉,所以我不太愿意写一个答案。我看不出你为什么要用asm手工写第一个答案。这太可怕了,就像用SSE3 FISTTP或SSE2CVTTSS2SI eax,xmm0手工编写asm试图避免的那种情况。鉴于SSE math(x86-64的默认值)直接支持截断转换,我希望比任何编译器都知道如何使用它,但请检查asm。(使用cvtss2si
进行非截断转换,这在C语言中是不容易访问的;您必须手持编译器内联lrint(x)或(int)rint(x)
并优化开销;IDK关于Delphi)奇怪的问题。使用具有相同名称的RTL函数。@PeterCordes,我也在想同样的问题,但是想到了一些优化的原因。我将很高兴地删除它们:-)
function Trunc(const x : Single) : Integer; register;
const cwChop : Word = $1F3F;
asm
SUB ESP,8
FSTCW [ESP]
FLDCW cwChop
FLD x
FISTP dword ptr [ESP+4]
FLDCW [ESP]
POP ECX
POP EAX
end;
function Frac(const x : Single) : Single; register;
begin
Result := x - Trunc(x);
end;
function Round(const x : Single) : Integer; register;
asm
SUB ESP,4
FLD x
FISTP dword ptr [ESP]
POP EAX
end;