将两个32位寄存器中的64位除以32位

时间:2010-10-14 11:51:12

标签: javascript math assembly 64-bit

我正在尝试用JavaScript编写x86模拟器以用于教育目的。 我已经编写了一个编译器,目前我正在尝试用JavaScript编写x86模拟器。

但是我的DIV指令存在问题。根据{{​​3}},DIV将64位数作为输入,将EDX解释为较高的32位,将EAX解释为较低的32位。然后它将该数字除以DIV参数,并将结果(如果它不大于0xFFFFFFFF)放入EAX,将余数放入EDX。

由于JavaScript不支持64位整数,我需要应用一些技巧。但到目前为止,我没有提出有用的东西。

这里有人知道如何使用32位算法正确实现吗?

1 个答案:

答案 0 :(得分:1)

我之前的版本不正确,所以我会重写它。

JS中的最大int是53位,我们可以使用它。

你取x[63:16](48位)并除以。 Res = x[63:16] / y * 16<< 0x01Rem = x[63:16] % y * 16。 然后执行:Res |= (Rem | x[15:0]) / y

* - x[a:b]表示从第a到第b的x位。例如X = 0110x[3:1] = 011