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

回答

1

下面是一些按預期運行的代碼。調試(不完整)代碼有點困難。由於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

相關問題