我试图用拇指移动负值。
在ARM中很简单,
mvn r0, #1
如何将负值移到Thumb中的寄存器?
感谢。
答案 0 :(得分:1)
在ARM中很简单
实际上,这并不容易。例如,如果您想模仿return -1;
,则需要以下内容,
mvn r0, #0
原因是mvn
不(或位翻转)和否定,两位补充需要你不减去一个。有关详细信息,请参阅ARM site。
我们可以在神螺栓上看到例子,
thumb1 版本是,
mov r0, #1
neg r0, r0
neg
或否定正在为我们进行二进制补码运算。较新版本的 thumb 指令集(通常称为 thumb2 )可以执行mvn
指令的版本。您可以简单地编写mov r0, #-1
并让编译器/汇编程序为您找出算法。它将检查常量并选择mvn
编码,其中源更多 humon 友好。
显然,如果你只有 thumb1 并且不存在mvn
指令,那么mov r0, #-1
将无法汇编,你需要一些两(16位)指令/操作码来实现同一件事情。使用两条指令可能有多种方法可以获得否定值(取决于常量值和/或周围代码)。
如果您真的打算mvn r0, #1
,我建议您对; -2 to 'r0'
发表评论。
如果您打算使用位掩码,则可以使用ldr r0, =0xfffffffe
,如果可用,它将选择mvn r0,#1
。但是,你的问题标题是否定,这通常意味着两个补码。
答案 1 :(得分:0)
有一个MVN的T1编码。
mov r0,#1
mvn r0,r0
或mvns如果你的汇编程序对语言是真的(gnu当然不是)。
在许多建筑参考手册
中都清楚地阐明了这一点