Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 需要帮助将x86 ASM转换为x64吗_Delphi_Assembly_X86_X86 64_32bit 64bit - Fatal编程技术网

Delphi 需要帮助将x86 ASM转换为x64吗

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

我有一个库,它为一些函数使用汇编代码,我想在x64上编译它,当然是抛出错误。有人能帮我纠正一下吗(甚至解释一下为什么这些函数是用ASM编写的)


最谦虚的感谢

我认为没有理由在汇编程序中实现这些函数。现代的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或SSE2
CVTTSS2SI 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;