如何在 Thumb 中移动负数

How to move negative numbers in Thumb

我正在尝试移动拇指中的负值。

在 ARM 中很容易,

mvn r0, #1

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

谢谢。

存在MVN的T1编码。

mov r0,#1
mvn r0,r0

或者 mvns,如果你的汇编程序符合该语言(gnu 当然不是)。

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

In ARM its easy

其实并没有那么容易。例如,如果你想模拟 return -1; 你需要以下内容,

mvn r0, #0

原因是 mvn 不是 (或位翻转)并且 负数 需要您 not减一。在 ARM site.

上可以找到更多信息

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

  1. ARM
  2. Thumb
  3. Thumb2

thumb1版本是,

mov r0, #1
neg r0, r0

negnegate 正在为我们做 twos-complement 运算。 thumb 指令集的较新版本(通常称为 thumb2)能够执行 mvn 指令的一个版本。你可以简单地写 mov r0, #-1 并让 compiler/assembler 为你算出算术。它将检查常量和 select mvn 编码,源代码更 humon 友好。

显然,如果您只有 thumb1 而没有 mvn 指令,则 mov r0, #-1 不会 assemble 并且您需要一些两个(16 位)instructions/opcodes 来实现同样的事情。可能有多种方法可以使用两条指令获取负值(取决于常数值 and/or 周围的代码)。


如果您真的想要 mvn r0, #1,我建议您评论 ; -2 to 'r0'

如果您想要一个位掩码,则可以使用 ldr r0, =0xfffffffe,如果可用,它将选择 mvn r0,#1。但是,您的问题标题说 negative 这通常意味着 twos-complement.