LPC111x 系列是否支持高位寄存器的 MOV 指令?

Does LPC111x series support MOV instruction with High registers?

UM10398 LPC111x/LPC11Cxx User manual 修订版 12.3 — 2014 年 6 月 10 日说

In these instructions, Rd, and Rm must only specify R0-R7

在“28.5.5.5.5 MOV 和 MVN”中的“28.5.5.5.3 限制”中。

另一方面,UM10398 中的“28.5.5.5.5 示例”说

MOVS R0, #0x000B ; Write value of 0x000B to R0, flags get updated
MOVS R1, #0x0 ; Write value of zero to R1, flags are updated
MOV R10, R12 ; Write value in R12 to R10, flags are not updated
MOVS R3, #23 ; Write value of 23 to R3
MOV R8, SP ; Write value of stack pointer to R8
MVNS R2, R0 ; Write inverse of R0 to the R2 and update flags

在此示例中,使用了 R10R12R8SP,尽管它们看起来不像 R0-R7。 (根据 UM10398 28.4.1.3 核心寄存器,SP 似乎等同于 R13

还有一件事是,当我阅读re-ejected-thumbref2.pdf时,我发现

MOV Rd, Rm 0 1 0 0 0 1 1 0 H1 H2 _ Rm _ _ Rd _

这表明高位寄存器可用于 MOV 指令。这个文件也说

Rd or Rm must be a *high register*

关于这个 MOV Rd, Rm 说明。

虽然带S的说明(带标志更新)不在本文档中(在本文档中,不带S的说明被称为更新标志)并且本文档应该是另一个CPU(可能是GBA中使用的,根据URL路径),我参考了这篇文档,希望LPC111x的指令集与这篇文档中描述的指令集相似。

综上所述,我能做吗

在 LPC111x 中(或 LPC1114FN28/102,如果您需要特定的 CPU 指向)?

LPC1114FN28 具有 ARM Cortex-M0 内核,因此 its MOV instruction 对寄存器没有 low/high 限制。但是,由于 Thumb 指令集最初没有 MOV 低到低指令,为了兼容性,您的 assembler 可能会使用 ADDS 指令来实现 MOV R0、R1。

例如,如果我 assemble 以下 as -mcpu=cortex-m0 t117.s:

    # .syntax unified
    .thumb

    MOV R0, R1
    MOV R8, R1
    MOV R0, R9
    MOV R8, R9

创建的目标文件包含以下指令,如 objdump -d 所示:

   0:   1c08            adds    r0, r1, #0
   2:   4688            mov     r8, r1
   4:   4648            mov     r0, r9
   6:   46c8            mov     r8, r9

通过取消注释 .syntax unified 指令并重新组装它,反汇编结果如预期:

   0:   4608            mov     r0, r1
   2:   4688            mov     r8, r1
   4:   4648            mov     r0, r9
   6:   46c8            mov     r8, r9

我相信声明"In these instructions, Rd, and Rm must only specify R0-R7" 仅适用于具有此限制的 MOVS 指令。