所以我有我的模拟器的代码,它将字节转换为十六进制

byteToHex(opcode) {
        var tempCode = (opcode).toString(16).toUpperCase()
        var addln = 4 - tempCode.length
        var pad =""
        for(var i = 0; i< addln; i++) {
            pad = pad + "0"
        }
        var newCode = "0x"+ pad + tempCode
        return newCode;
}


我有执行位运算以获得一个操作码然后将其转换以供使用的这段代码。

this.opcode = (this.memory[this.pc] << 8) | this.memory[this.pc + 1]
    console.log(this.memory)
    console.log("before conversion", this.opcode)
    this.opcode = this.byteToHex(this.opcode)
    console.log(this.opcode)
    //this just returns the first 'letter' of the opcode
    switch (this.opcode & 0xF000)...


这是控制台输出

Array [ 240, 144, 144, 144, 240, 32, 96, 32, 32, 112, 70 more… ]
before conversion 0
0x0000


这意味着我没有正确获得操作码,但是我不知道如何解决它。
为了更好地了解该项目:Github

最佳答案

这是一些可以按预期运行的代码。调试(不完整的)代码有点困难。由于StackOverflow是关于具体的问题和答案的,所以我什至不必费心去玩猜测/侦探游戏来找出错误所在。

240d = 0xF0

144d = 0x90

[240,144]被视为单个16位大端数字是0xF090(Intel的东西是小端数字,即最低有效字节在前)



window.addEventListener('load', onDocLoaded, false);

var memoryContents = [240, 144, 144, 144, 240, 32, 96, 32, 32, 112];

function getTwoLocationsBigEndian(indexOfFirst)
{
	var result = (memoryContents[indexOfFirst] << 8) | (memoryContents[indexOfFirst+1]);
	return result;
}

function getTwoLocationsLittleEndian(indexOfFirst)
{
	var result = (memoryContents[indexOfFirst+1] << 8) | (memoryContents[indexOfFirst]);
	return result;
}

function byteToHex(opcode)
{
	var tempCode = (opcode).toString(16).toUpperCase()
	var addln = 4 - tempCode.length
	var pad =""
	for(var i = 0; i< addln; i++)
	{
		pad = pad + "0"
	}
	var newCode = "0x"+ pad + tempCode
	return newCode;
}

function onDocLoaded(evt)
{
	console.log("Memory contents: " + memoryContents);

	var opcode = getTwoLocationsBigEndian(0);
	console.log("***** BIG endian *****");
	console.log("First 2 locs as a 16bit num (dec): " + opcode );
	console.log("First 2 locs as a 16bit num (hex): " + byteToHex(opcode) );

	opcode = getTwoLocationsLittleEndian(0);
	console.log("***** LITTLE endian *****");
	console.log("First 2 locs as a 16bit num (dec): " + opcode );
	console.log("First 2 locs as a 16bit num (hex): " + byteToHex(opcode) );
}

10-06 07:34
查看更多