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

时间:2016-05-19 15:59:03

标签: assembly lpc machine-language

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

在此示例中,R10R12R8SP被使用,尽管它们似乎不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指向)?

1 个答案:

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