从整数中删除符号扩展?
Removing sign extension from an integer?
我正在尝试构建二进制格式的机器指令 loadi
。机器指令本身由操作码组成,即 00000
目标寄存器、立即数位和一些常量值。它应该是这样的:
00000 00 0 00000000
假设我们要执行指令 loadi 2 -123
。这将转换为机器指令:
0000010110000101
我正在尝试使用移位来构造此机器代码。我首先将目标寄存器移到正确的位置。然后,我移动立即位值:
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
.
您需要对值进行位掩码:
instr = (opCode << 11)
| (reg << 9)
| (1 << 8)
| (value & 0xff);
一般来说:您可能希望对所有值进行位掩码;那
将是合乎逻辑的。但希望 reg
和 opCode
永远不会
是可以设置未使用位的值。
另外:只有当目标机器和
host 对负数有相同的表示,而且
表示没有符号大小。 (当然,今天,2的
补充几乎是普遍的。但这可能值得检查
loadi
是如何解释其值字段的。)
我正在尝试构建二进制格式的机器指令 loadi
。机器指令本身由操作码组成,即 00000
目标寄存器、立即数位和一些常量值。它应该是这样的:
00000 00 0 00000000
假设我们要执行指令 loadi 2 -123
。这将转换为机器指令:
0000010110000101
我正在尝试使用移位来构造此机器代码。我首先将目标寄存器移到正确的位置。然后,我移动立即位值:
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
.
您需要对值进行位掩码:
instr = (opCode << 11)
| (reg << 9)
| (1 << 8)
| (value & 0xff);
一般来说:您可能希望对所有值进行位掩码;那
将是合乎逻辑的。但希望 reg
和 opCode
永远不会
是可以设置未使用位的值。
另外:只有当目标机器和
host 对负数有相同的表示,而且
表示没有符号大小。 (当然,今天,2的
补充几乎是普遍的。但这可能值得检查
loadi
是如何解释其值字段的。)