ASSEMBLY 64位× 64位除法

s8vozzvw  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(147)

如何在汇编8086中实现64位乘64位除法?我已经启用了.386指令的extendeed注册表。

aiazj4mn

aiazj4mn1#

滥用x87

FILD QWORD [SI]
FIDIV QWORD [BX]
FISTP QWORD [DI]

正如Peter Cordes提到的,在默认的FP舍入模式下,它舍入到最近,绑定到偶数。SSE 3中引入的FISTTP允许截断,因此其行为类似于IDIV指令。
它有两个舍入步骤,但由于x87保留64位,除数最多为263-1,增加或减少被除数会使商的变化大于eps。因此,它的行为就像第一步是准确的。

igetnqfo

igetnqfo2#

x86知道一个64 × 32位的除法,其中余数和商的结果为32位,如下所示

POP     EBX      ;DIVISOR
POP     EDX      ;MSW OF DIVIDEND
POP     EAX      ;LSW OF DIVIDEND
DIV     EBX      ;64/32 BIT DIVIDE
PUSH    EDX      ; remainder
PUSH    EAX      ; quotient

你不想除以一个不适合32位的64位数,因为你会失去10位的精度,最低限度。
如果你坚持下去,你可以从中组成一个64/64的除法,然后分析你是否真的喜欢它。
如果你知道如何将一个2位数的十进制数除以一个2位数的十进制数(长除法),你可以使用上面的方法来完成将一个2位数的2^32基数除以一个2位数的2^32基数。这是留给读者的练习。

相关问题