32位寄存器将64位分成两个32位寄存器

问题描述:

我正在尝试在JavaScript中为教育目的编写x86模拟器。 我已经编写了一个编译器,目前我正尝试在JavaScript中编写x86模拟器。32位寄存器将64位分成两个32位寄存器

但是我有一个DIV指令的问题。根据http://siyobik.info/index.php?module=x86&id=72 DIV将64位数作为输入,将EDX解释为较高的32位,将EAX解释为较低的32位。然后它将这个数字除以DIV参数,并将结果(如果它不大于0xFFFFFFFF)放入EAX,其余部分放入EDX。

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

有人在这里有一个想法如何正确实现与32位算术?

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

JS中的最大整数是53位,我们可以利用它。你需要x[63:16](48位)并划分。 Res = x[63:16]/y * 16<< 0x01Rem = x[63:16] % y * 16。 Then do:Res |= (Rem | x[15:0])/y

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

+0

这是,我相信,不正确。如果x [63:48]是4并且x [15:0]也是4并且其余的是0,则这会给出4/2 + 4/2 = 4,这当然是不正确的。 – Simon 2010-10-14 12:03:59

+0

@Simon,是的,现在是固定的 – Andrey 2010-10-14 12:04:54

+0

好的,又错了,因为如果x [31:16] = 1,并且将它除以16,那么它将得到0,它应该是1 – Simon 2010-10-14 12:08:20