是否有内置解决方案可以对 64 位类型化数组操作数执行所有按位运算?

问题描述

为了研究,我正在 Node.js 中构建一个基本的 x86-64 模拟器,如下所示:

const registerContainers = {
    GPR: [],}
for (let i = 0; i < 16; i++) {
    registerContainers.GPR.push(new Uint8Array(8))
}

const registers = {}

class Register {
    constructor(name,container,offset,bytes){
        registers[name] = this
        this.container = container
        this.bytes = bytes
        this.offset = offset
    }
    read(){
        if (this.bytes === this.container.byteLength) return this.container
        else return this.container.subarray(this.offset,this.container.length)
    }
    set(value){
        this.container.set(value,this.offset)
    }
}

new Register('rax',registerContainers.GPR[0],8) // Register A Extended
new Register('eax',4,4)
new Register('ax',6,2)
new Register('ah',1)
new Register('al',7,1)

new Register('rbx',registerContainers.GPR[1],8) // Register B Extended
new Register('ebx',4)
new Register('bx',2)
new Register('bh',1)
new Register('bl',1)

// ... and so on ...

console.log('registers',registers)
console.log('registerContainers',registerContainers)

registers.eax.set(Uint8Array.from([0x1f,0x1f,0x1f]))
console.log('updated GPR',registerContainers.GPR[0])

但我当然面临的挑战是 JavaScript 通常不能很好地处理 64 位数学。我的下一个任务是创建一个 ALU 类,该类在 x86-64 架构上的任意两个寄存器之间执行所有可能的数学运算。我认为 64 位数学问题将适用于尝试将它们与 > 32 位 TypedArrays 一起用作操作数,对吗?

bitwise operators 的 MDN 文档中,它说:

按位运算符将其操作数视为一组 32 位(零和一)并返回标准 JavaScript 数值。

所以我相信在上述代码的上下文中执行 registerContainers.GPR[0] ^ registerContainers.GPR[1] 不会执行正确的数学运算。正确吗?

我的尝试:

我认为 Atomics 是 JS 中的原生模块,它支持共享但也支持非共享内存按位操作。但是,我在文档中没有看到关于任何最大数学大小要求的声明。

与其反复试验,我想我应该问:在 JavaScript 中处理 >32 位类型数组之间的按位运算的正确方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)