【发布时间】:2021-09-13 01:04:27
【问题描述】:
我正在为 ARM7TDMI(ARMv4T 架构)使用汇编程序。我正在使用 Thumb 模式,因为 ROM 具有 16 位总线 (GBA)。我想对一个 32 位寄存器进行符号扩展,以获取另一个寄存器,其中所有位都设置为源寄存器第 31 位的副本。符号扩展的寄存器是高位寄存器,特别是 R9。
我目前正在使用这个:
mov r0,r9
mvn r0,r0 @ sign bit needs to be inverted due to
@ the silly ARM carry convention
add r0,r0 @ copy sign bit to carry
sbc r0,r0 @ sign-extend R9
但这需要 4 条指令。有没有更短的方法?
【问题讨论】:
-
试试
mov r1, r9; asrs r1, r1, #32 -
@fuz:请注意,您只需要移动
#31,因此您可以在超出范围移位计数的工作方式与 ARM 不同的其他 ISA 上执行相同的操作。原来的符号位成为新的 LSB,其他 31 位是它的副本。 -
@fuz 哦,天哪,我完全错过了那个指令/变体。正如您可能知道的那样,我仍然习惯于 Thumb 指令集。我的印象是“每一位操作都需要一个寄存器”。顺便说一句,如果这是一个答案,我会同意的。是的,我更喜欢 31。
-
您可以随时询问编译器,例如
int64_t sext(int32_t x){ return x; }。 godbolt.org/z/EErn4sY5a 编译为asrs r1, r0, #31/bx lr
标签: assembly arm twos-complement sign-extension