【发布时间】:2013-04-04 06:39:42
【问题描述】:
假设我在寄存器 v1 中有一个 32 位有符号整数。我想让这个值的二进制补码存储在另一个寄存器 v2 中。在普通数学中,这意味着我需要翻转所有 32 位,然后加 1。
如何翻转位?
提前致谢。
【问题讨论】:
标签: arm bit-manipulation
假设我在寄存器 v1 中有一个 32 位有符号整数。我想让这个值的二进制补码存储在另一个寄存器 v2 中。在普通数学中,这意味着我需要翻转所有 32 位,然后加 1。
如何翻转位?
提前致谢。
【问题讨论】:
标签: arm bit-manipulation
试试这个,(MVN move with negate):
MVN v2, v1
这就像你问的那样“翻转位”。然后你只需 +1:
ADD v2, v1, #1
或者,您可以只使用 NEG v2、v1 指令(RSB v2、v1、#0 的同义词)在单个指令中执行等效操作。
【讨论】:
或者比MVN慢一点:
MOV v0,-1
MUL v2,v1,v0
【讨论】:
似乎没有专门的命令来反转 ARM 中的寄存器。但下面有一个简单而快速的替代品(用 gdb/qemu 进行了检查):
rsb Rx,Rx,-1
执行以下操作:
输出 = -1 - 输入
这是获得逻辑非的正确过程。
【讨论】: