2016-05-19 52 views
0

UM10398 LPC111x/LPC11Cxx User manual启12.3 - 10 2014年6月说LPC111x系列是否支持带有高寄存器的MOV指令?

在这些指令中,Rd和Rm必须只在“28.5指定 “28.5.5.5.3限制” R0-R7

。 5.5 MOV和MVN“。

在另一方面, “实施例28.5.5.5.5” 在UM10398说

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。 (SP似乎相当于R13,根据UM10398 28.4.1.3内核寄存器)

一件事是,当我读​​,我发现

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

并且此建议高寄存器可用于MOV指令。该文件还表示,

路或Rm必须是*高*登记

这个MOV Rd, Rm指令。

虽然与S指令(标志更新)不是这份文件上(在无S这个文件的说明更新标志表示)和本文件应该是另一个CPU(也许有在GBA使用,根据网址路径),我用这个文档作为参考,希望LPC111x的指令集与本文档中描述的类似。

最后,我可以做

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

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

回答

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指令。