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
在此示例中,使用了 R10
、R12
、R8
和 SP
,尽管它们看起来不像 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的指令集与这篇文档中描述的指令集相似。
综上所述,我能做吗
MOV R0, R1
(低位寄存器到低位寄存器)
MOV R8, R1
(低位寄存器到高位寄存器)
MOV R0, R9
(高寄存器到低寄存器)
MOV R8, R9
(高位寄存器到高位寄存器)
在 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 指令。
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
在此示例中,使用了 R10
、R12
、R8
和 SP
,尽管它们看起来不像 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的指令集与这篇文档中描述的指令集相似。
综上所述,我能做吗
MOV R0, R1
(低位寄存器到低位寄存器)MOV R8, R1
(低位寄存器到高位寄存器)MOV R0, R9
(高寄存器到低寄存器)MOV R8, R9
(高位寄存器到高位寄存器)
在 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 指令。