如何在汇编8086中实现64位乘64位除法?我已经启用了.386指令的extendeed注册表。
aiazj4mn1#
滥用x87
FILD QWORD [SI] FIDIV QWORD [BX] FISTP QWORD [DI]
正如Peter Cordes提到的,在默认的FP舍入模式下,它舍入到最近,绑定到偶数。SSE 3中引入的FISTTP允许截断,因此其行为类似于IDIV指令。它有两个舍入步骤,但由于x87保留64位,除数最多为263-1,增加或减少被除数会使商的变化大于eps。因此,它的行为就像第一步是准确的。
FISTTP
IDIV
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基数。这是留给读者的练习。
2条答案
按热度按时间aiazj4mn1#
滥用x87
正如Peter Cordes提到的,在默认的FP舍入模式下,它舍入到最近,绑定到偶数。SSE 3中引入的
FISTTP
允许截断,因此其行为类似于IDIV
指令。它有两个舍入步骤,但由于x87保留64位,除数最多为263-1,增加或减少被除数会使商的变化大于eps。因此,它的行为就像第一步是准确的。
igetnqfo2#
x86知道一个64 × 32位的除法,其中余数和商的结果为32位,如下所示
你不想除以一个不适合32位的64位数,因为你会失去10位的精度,最低限度。
如果你坚持下去,你可以从中组成一个64/64的除法,然后分析你是否真的喜欢它。
如果你知道如何将一个2位数的十进制数除以一个2位数的十进制数(长除法),你可以使用上面的方法来完成将一个2位数的2^32基数除以一个2位数的2^32基数。这是留给读者的练习。