我正在尝试以二进制格式构造机器指令loadi
。机器指令本身由操作码组成,操作码是00000
目标寄存器,立即位和一些常量值。它应该是这样的:
00000 00 0 00000000
假设我们想要执行指令loadi 2 -123
。这将转换为机器指令:
0000010110000101
我正在尝试使用bitshifting构建此机器代码。我首先将目的地寄存器移到正确的位置。然后,我转移立即位值:
instr = (dr << 9); // Destination register
instr += (1 << 8); // Immediate bit value
这将产生:
00000 10 1 00000000
我需要添加以完成指令并生成目标代码的最后一部分是常量值-123
。但问题是,当我尝试:
instr += constant;
它不起作用。我不需要在这里做位移,因为我希望它从第0位开始。经过一些测试后,我认为问题可能是因为-123
是符号扩展。我只想要前8位。
是否有一种简单的方法来检索-123
的前8位?
此问题中的所有值均由int
类型表示。但是,我只使用第一个16 bits
。
答案 0 :(得分:0)
您需要对值进行掩码:
instr = (opCode << 11)
| (reg << 9)
| (1 << 8)
| (value & 0xff);
一般情况下:你可能想要掩盖所有的值;那
这是合乎逻辑的。但希望reg
和opCode
永远不会
是可以设置未使用位的值。
另外:这只有目标机器和
主机具有相同的负数表示形式
表示没有签名。 (当然,今天,2&#39; s
补充几乎是普遍的。但它可能值得检查
确切地说loadi
如何解释其值字段。)