【发布时间】:2016-07-17 14:15:00
【问题描述】:
我正在对汇编 MIPS(32 位)进行一些练习,但我真的不明白左移 2 是如何工作的。
为了更好地解释,我将添加几个示例。
- 指令是 0x91050014
我必须取最后 16 位,然后将它们扩展到 32 位。
所以我采用 0014,由于 MSB 为零,这意味着它是一个正数,所以我将它扩展到 32 位,如下所示:0x00000014
之后我必须向左移动 2,所以(我使用 [] 删除和 {} 添加):
[00]00 0000 0000 0000 0000 0000 0001 0100{00}
我可以得出的结论是 0x00000050
一旦最后 16 个字节不是正数,我就会遇到问题,就像在这个例子中一样:
- 指令是 0x10A6FFEC
我采用 FFEC,由于 MSB 是 F,这意味着它是一个负数,所以我将其扩展为 32 位,如下所示:0xFFFFFFEC
现在我发现自己是这样的:1111 1111 1111 1111 1111 1111 1110 1100
而且我不明白如何应用这种转变。
提前致谢。
【问题讨论】:
-
完全一样。顺便说一下,它们是 16 位,而不是字节。
-
@harold 已更正,抱歉。所以我只删除了前几个 11 并添加 00 作为 LSB,我应该得到 0xFFFFFFB0,对吗?
-
@harold 完美。如果问的不是太多,我还有最后一件事,作为最后一步,我必须用 PC 计算总和,它是 0x0000080C + 0xFFFFFFB0。结果应该是 0x1000007BC 但由于我必须坚持使用 32 位,所以只说 0x000007BC 是否正确?
-
是的,你会发现它可以解释为 0xFFFFFFB0 为负数
-
@harold 非常感谢!
标签: assembly bit-manipulation mips mips32 machine-code