首页 > 解决方案 > 在 Thumb 模式下将寄存器符号扩展为 64 位(设置所有位 = 符号位)

问题描述

我正在为 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 条指令。有没有更短的方法?

标签: assemblyarmtwos-complementsign-extension

解决方案


使用算术右移 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

推荐阅读