【问题标题】:How get two's complement of a register value in ARM?如何在ARM中获得寄存器值的二进制补码?
【发布时间】:2013-04-04 06:39:42
【问题描述】:

假设我在寄存器 v1 中有一个 32 位有符号整数。我想让这个值的二进制补码存储在另一个寄存器 v2 中。在普通数学中,这意味着我需要翻转所有 32 位,然后加 1。

如何翻转位?

提前致谢。

【问题讨论】:

    标签: arm bit-manipulation


    【解决方案1】:

    试试这个,(MVN move with negate):

    MVN v2, v1
    

    这就像你问的那样“翻转位”。然后你只需 +1:

    ADD v2, v1, #1
    

    或者,您可以只使用 NEG v2、v1 指令(RSB v2、v1、#0 的同义词)在单个指令中执行等效操作。

    【讨论】:

    • 我认为 mvn 只不是寄存器。
    • 问题是“如何翻转位?”。 MVN 将翻转位。
    【解决方案2】:

    或者比MVN慢一点:

    MOV v0,-1

    MUL v2,v1,v0

    【讨论】:

      【解决方案3】:

      似乎没有专门的命令来反转 ARM 中的寄存器。但下面有一个简单而快速的替代品(用 gdb/qemu 进行了检查):

      rsb Rx,Rx,-1

      执行以下操作:

      输出 = -1 - 输入

      这是获得逻辑非的正确过程。

      【讨论】:

      • 问题是求否定(二进制补码),而不是逻辑非(一个补码)。所以我认为你的 -1 应该替换为 0。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2021-12-14
      相关资源
      最近更新 更多