【问题标题】:Does LPC111x series support MOV instruction with High registers?LPC111x 系列是否支持高位寄存器的 MOV 指令?
【发布时间】:2016-05-20 05:24:15
【问题描述】:

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_

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

Rd 或 Rm 必须是*高位寄存器*

关于这个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)?

【问题讨论】:

    标签: assembly lpc machine-code


    【解决方案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 指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2011-05-04
      • 2022-01-15
      • 2015-11-01
      • 2019-09-12
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多