【问题标题】:Why does my bitwise operation return 0 in my emulator?为什么我的按位运算在我的模拟器中返回 0?
【发布时间】:2017-04-27 12:27:22
【问题描述】:

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

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

【问题讨论】:

    标签: javascript hex bit-manipulation emulation bitwise-operators


    【解决方案1】:

    下面是一些按预期运行的代码。调试您的(不完整的)代码有点困难。由于 StackOverflow 是关于具体问题和答案的,我什至不会费心去玩猜测/侦探游戏来找出你哪里出错了..

    240d = 0xF0

    144d = 0x90

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

    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) );
    }

    【讨论】:

    • 您的代码有效...当我在 stackoverflow 上运行它时。但它对我不起作用......
    • 太好了,这是很好的第一步。现在看来,您必须将“对我不起作用”扩展为有用且能够解决的问题。您在控制台中遇到了哪些错误,您期望的结果是什么,您实际得到的结果是什么?
    • 感谢您的回复。在每个周期更改为按位结果之前,我的操作码设置为 0。这几乎就像函数没有给操作码任何值一样。虽然没有js错误。结果,我仍然得到 0 和 0x0000。
    • 我也链接到了 github
    • 好的,我修好了。这是阵列的问题。现在它只是一遍又一遍地播放相同的值
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2018-07-06
    • 2023-04-06
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多