在 Thumb 模式下将寄存器符号扩展为 64 位(设置所有位 = 符号位)
Sign extend a register to 64-bit (set all bits = sign bit) in Thumb mode
我正在使用 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 条指令。有没有更短的路?
使用算术右移 31 或 32 将符号位作为 -1
或 0
复制到新寄存器中:
mov r1, r9 @ move to a low register to be usable as an operand
asrs r0, r1, #31 @ generate -1 or 0 in R0 depending on sign of R1
我正在使用 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 条指令。有没有更短的路?
使用算术右移 31 或 32 将符号位作为 -1
或 0
复制到新寄存器中:
mov r1, r9 @ move to a low register to be usable as an operand
asrs r0, r1, #31 @ generate -1 or 0 in R0 depending on sign of R1