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
或<< 0x01
。 Rem = 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
这是,我相信,不正确。如果x [63:48]是4并且x [15:0]也是4并且其余的是0,则这会给出4/2 + 4/2 = 4,这当然是不正确的。 – Simon 2010-10-14 12:03:59
@Simon,是的,现在是固定的 – Andrey 2010-10-14 12:04:54
好的,又错了,因为如果x [31:16] = 1,并且将它除以16,那么它将得到0,它应该是1 – Simon 2010-10-14 12:08:20