【问题标题】:Assembly MIPS - Shift of an address汇编 MIPS - 地址移位
【发布时间】: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


【解决方案1】:

同样的方式

1111 1111 1111 1111 1111 1111 1110 1100

将会

[11]11 1111 1111 1111 1111 1111 1110 1100{00}

原来如此

1111 1111 1111 1111 1111 1111 1011 0000

0xffffffb0

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多