如何在 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看到例子,
thumb1版本是,
mov r0, #1
neg r0, r0
neg
或 negate 正在为我们做 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.
我正在尝试移动拇指中的负值。
在 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看到例子,
thumb1版本是,
mov r0, #1
neg r0, r0
neg
或 negate 正在为我们做 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.