我试图在拇指中移动一个负值。
在 ARM 中很容易,
mvn r0, #1
如何将负值移动到 Thumb 中的寄存器?
谢谢。
在 ARM 中很容易
实际上,这并不容易。例如,如果您想模拟return -1;
,您需要以下内容,
mvn r0, #0
原因是mvn
二进制补码不是(或位翻转)和负数需要你不要减去一个。更多信息可在ARM 网站上找到。
我们可以在god bolt上看到例子,
thumb1版本是,
mov r0, #1
neg r0, r0
neg
or 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
是否可用。但是,您的问题标题是否定的,这通常意味着补码。
MVN有一个T1编码。
mov r0,#1
mvn r0,r0
或 mvns,如果您的汇编程序对语言是正确的(当然 gnu 不是)。
这在许多架构参考手册中都有清楚的说明