如何在Thumb中移动负数

时间:2015-11-19 02:52:06

标签: assembly arm thumb

我试图用拇指移动负值。

在ARM中很简单,

mvn r0, #1

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

感谢。

2 个答案:

答案 0 :(得分:1)

  

在ARM中很简单

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

mvn r0, #0

原因是mvn (或位翻转)和否定,两位补充需要你减去一个。有关详细信息,请参阅ARM site

我们可以在神螺栓上看到例子,

  1. ARM
  2. Thumb
  3. Thumb2
  4. 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当然不是)。

在许多建筑参考手册

中都清楚地阐明了这一点