为什么我的模拟器中按位操作返回0?

问题描述:

所以,我有我的模拟器此代码的字节转换为十六进制为什么我的模拟器中按位操作返回0?

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 = 0×90

[240,144]作为一个单一的16位大端数处理被0xF090(英特尔的东西是小端,即至少显著字节至上)

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

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

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

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

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

 
function onDocLoaded(evt) 
 
{ 
 
\t console.log("Memory contents: " + memoryContents); 
 
\t 
 
\t var opcode = getTwoLocationsBigEndian(0); 
 
\t console.log("***** BIG endian *****"); 
 
\t console.log("First 2 locs as a 16bit num (dec): " + opcode); 
 
\t console.log("First 2 locs as a 16bit num (hex): " + byteToHex(opcode)); 
 

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

+0

你的代码工作...当我在stackoverflow上运行它。它虽然不适用于我... – Blaze349

+0

太棒了,这是一个很好的第一步。现在看来,你必须将“对我不起作用”扩展成有用的东西,并且能够解决。你在控制台遇到了什么错误,你期望结果如何,结果你实际得到了什么? – enhzflep

+1

谢谢你的回应。在每个周期更改为按位结果之前,我的操作码设置为0。这几乎就像函数没有给操作码提供任何值。虽然没有js错误。结果我仍然得到0和0x0000。 – Blaze349