1

我试图在拇指中移动一个负值。

在 ARM 中很容易,

mvn r0, #1

如何将负值移动到 Thumb 中的寄存器?

谢谢。

4

2 回答 2

1

在 ARM 中很容易

实际上,这并不容易。例如,如果您想模拟return -1;,您需要以下内容,

mvn r0, #0

原因是mvn二进制补码不是(或位翻转)和负数需要你不要减去一个。更多信息可在ARM 网站上找到。

我们可以在god bolt上看到例子,

  1. 手臂
  2. 拇指
  3. 拇指2

thumb1版本是,

mov r0, #1
neg r0, r0

negor negate为我们做补码运算。较新版本的thumb指令集(通常称为thumb2)能够执行mvn指令的一个版本。您可以简单地编写mov r0, #-1并让编译器/汇编器为您计算算术。它将检查常量并选择mvn源代码更人性化的编码。

显然,如果您只有thumb1并且不mvn存在指令,mov r0, #-1则不会汇编并且您需要一些两个(16 位)指令/操作码来实现相同的目标。可能有多种方法可以使用两条指令(取决于常量值和/或周围代码)获得否定值。


如果您真的打算mvn r0, #1,我建议您对; -2 to 'r0'.

如果您打算使用位掩码,则ldr r0, =0xfffffffe可以使用它,它会选择mvn r0,#1是否可用。但是,您的问题标题是否定的,这通常意味着补码。

于 2015-11-19T14:39:08.613 回答
0

MVN有一个T1编码。

mov r0,#1
mvn r0,r0

或 mvns,如果您的汇编程序对语言是正确的(当然 gnu 不是)。

这在许多架构参考手册中都有清楚的说明

于 2015-11-19T14:33:41.463 回答