假设我们在寄存器中有一个 32 位的值:r0 = 0x12345678; 任务是获取低半字部分,即 0x5678(或者使高半字无效)。就 C 代码而言,它相当于:r0 = r0 & 0xFFFF;
限制:它需要在单个 ARM7TDMI 指令中完成,而不使用其他寄存器。这是因为获得高一半只是一个正确的转变,例如LSR r0, r0, #16
.
到目前为止,我可以通过 2 条指令来完成:左移 + 右移、旋转 + 移位;或者通过使用包含掩码 0xFFFF 和 AND-ing 的附加寄存器。
在 ARM7TDMI 上,不可能只与像 0xFFFF 这样的常数进行与运算,因为它不适合立即值方案。
此外,看起来现代 ARM-s 有“MOVT”,可以通过做来解决它MOVT r0, #0
,但 ARM7TDMI 没有!
我想相信没有 MOVT 是可能的,因为它是如此基本的东西。