相关疑难解决方法(0)

如何在64位代码中实现高效的32位DivMod

我想使用一个DivMod专门在32位操作数上运行的函数.RTL中实现返回16位变量中的值.它的声明是:

procedure DivMod(Dividend: Cardinal; Divisor: Word; var Result, Remainder: Word);
Run Code Online (Sandbox Code Playgroud)

所以,我不能使用它,因为我的输入可能溢出返回值.

朴素的Pascal实现如下所示:

procedure DivMod(Dividend, Divisor: Cardinal; out Quotient, Remainder: Cardinal);
begin
  Quotient := Dividend div Divisor;
  Remainder := Dividend mod Divisor;
end;
Run Code Online (Sandbox Code Playgroud)

这很好地工作,但执行两次分裂.由于该函数是由我的代码中的一部分性能瓶颈调用的,所以我只想执行一次除法.为此我从这个问题使用Serg的32位DivMod:是否有一个DivMod*不限于Word(<= 65535)?

procedure DivMod(Dividend, Divisor: Cardinal; out Quotient, Remainder: Cardinal);
asm
        PUSH EBX
        MOV  EBX,EDX
        XOR  EDX,EDX
        DIV  EBX
        MOV  [ECX],EAX
        MOV  EBX,Remainder
        MOV  [EBX],EDX
        POP  EBX
end;
Run Code Online (Sandbox Code Playgroud)

这非常有效.

但现在我想要一个64位代码的函数版本.请注意,我仍然希望对32位操作数进行操作,并返回32位值.

我应该使用64位汇编程序重新编写函数,还是使用DivMod运行的RTL 的重载并返回64位值就足够了?

具体来说,我想知道在编写执行32位操作的64位代码时是否有性能优势.这甚至可能吗?或者我会简单地DivModUInt64参数重新实现重载?如果值得实现一个定制的64位asm版本,我将如何去做,注意操作数和操作是32位. …

delphi assembly x86-64

10
推荐指数
2
解决办法
1289
查看次数

标签 统计

assembly ×1

delphi ×1

x86-64 ×1