【问题标题】:How to save a group of registers and restore them later?如何保存一组寄存器并在以后恢复它们?
【发布时间】:2015-01-27 06:09:05
【问题描述】:

Arm 系统开发人员指南一书中的以下示例显示了在指令前递增 STM,然后在指令后递减 LDM

PRE r0 = 0x00009000
r1 = 0x00000009
r2 = 0x00000008
r3 = 0x00000007
STMIB r0!, {r1-r3}
MOV r1, #1
MOV r2, #2
MOV r3, #3

PRE(2) r0 = 0x0000900c
r1 = 0x00000001
r2 = 0x00000002
r3 = 0x00000003
LDMDA r0!, {r1-r3}
POST r0 = 0x00009000
r1 = 0x00000009
r2 = 0x00000008
r3 = 0x00000007

STMIB 指令将值 7、8、9 存储到内存中。然后我们将寄存器 r1 损坏为 r3。 LDMDA 重新加载原始值并恢复基指针 r0。

但是,r1,r2,r3的内存已经被1,2,3覆盖了。然后,如何恢复以前的值。它在哪里保存旧值?

【问题讨论】:

    标签: assembly arm cpu-registers instruction-set


    【解决方案1】:

    LDM/STM(在您的示例中为r0)的第一个操作数是基址寄存器。该寄存器保存寄存器列表中的值将被存储在内存中的地址。

    因此,例如,当您将STMIB r0!,{r1-r3}r0==0x9000 一起存储时,您会将r1 的值存储在地址0x9004r20x9008r30x900C。请注意,没有任何值存储在地址0x9000,因为您使用了IB,这意味着在(存储/读取)之前增加(地址)
    ! 表示最终地址 (0x900C) 将被写回 r0

    然后,当您执行LDMDA r0!,{r1-r3} 时,您将从r0==0x900C 开始。 DA 表示 在之后递减,因此地址将在我们加载每个寄存器后递减,并且由于最低的寄存器总是从最低的内存地址传输到/从最低的内存地址开始,我们首先从地址加载r3 0x900C,然后是来自0x9008r2,最后是来自0x9004r1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2017-12-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多