0

UM10398 LPC111x/LPC11Cxx 用户手册修订版 12.3 — 2014 年 6 月 10 日说

在这些说明中,Rd 和 Rm 只能指定 R0-R7

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

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

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

在这个例子中R10R12,R8SP被使用,尽管它们看起来并不R0-R7。(SP似乎相当于R13,根据 UM10398 28.4.1.3 核心寄存器)

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

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

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

Rd 或 Rm 必须是 *high 寄存器*

关于这个MOV Rd, Rm指令。

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

总之,我可以做

  • MOV R0, R1(低位寄存器到低位寄存器)
  • MOV R8, R1(低寄存器到高寄存器)
  • MOV R0, R9(高位寄存器到低位寄存器)
  • MOV R8, R9(高位寄存器到高位寄存器)

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

4

1 回答 1

1

LPC1114FN28 具有 ARM Cortex-M0 内核,因此其 MOV 指令对寄存器没有低/高限制。但是,由于 Thumb 指令集最初没有 MOV 从低到低的指令,为了兼容,您的汇编程序可能对 MOV R0、R1 使用 ADDS 指令。

例如,如果我将以下内容与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

我相信“在这些指令中,Rd 和 Rm 必须只指定 R0-R7”的声明仅适用于具有此限制的 MOVS 指令。

于 2016-05-19T21:24:15.430 回答