UM10398 LPC111x/LPC11Cxx User manual Rev。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示例”表示
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
。 (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 _
这表明High寄存器可用于MOV
指令。该文件还说明了
Rd或Rm必须是*高寄存器*
关于此MOV Rd, Rm
指令。
虽然S
(带有标志更新)的说明不在本文档中(在本文档中,没有S
的说明被称为更新标志),并且此文档应该用于另一个CPU(可能是一个使用过的CPU)在GBA中,根据URL路径),我使用此文档作为参考,希望LPC111x的指令集类似于本文档中描述的指令集。
总之,我可以吗
MOV R0, R1
(低寄存器到低寄存器)MOV R8, R1
(低位寄存器到高位寄存器)MOV R0, R9
(高位注册到低位寄存器)MOV R8, R9
(高位寄存器到高位寄存器)在LPC111x(或LPC1114FN28 / 102,如果你需要特定的CPU指向)?
答案 0 :(得分:1)
LPC1114FN28具有ARM Cortex-M0内核,因此its MOV instruction对寄存器没有低/高限制。但是,由于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指令。