微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM微处理器寄存器装载和存储

ARM微处理器寄存器装载和存储

时间:11-09 来源:互联网 点击:

传送单一数据

使用单一数据传送指令(STR 和 LDR)来装载和存储单一字节或字的数据从/到内存。寻址是非常灵活的。

首先让我们查看指令格式:

LDR{条件}    Rd, <地址>STR{条件}    Rd, <地址>LDR{条件}B   Rd, <地址>STR{条件}B   Rd, <地址>
指令格式

这些指令装载和存储 Rd 的值从/到指定的地址。如果象后面两个指令那样还指定了‘B’,则只装载或存储一个单一的字节;对于装载,寄存器中高端的三个字节被置零(zeroed)。

地址可以是一个简单的值、或一个偏移量、或者是一个被移位的偏移量。可以还可以把合成的有效地址写回到基址寄存器(去除了对加/减操作的需要)。

各种寻址方式的示例: 

译注:下文中的 Rbase 是表示基址寄存器,Rindex 表示变址寄存器,index 表示偏移量,偏移量为 12 位的无符号数。用移位选项表示比例因子。标准寻址方式 - 用 AT&T 语法表示为 disp(base, index, scale),用 Intel 语法表示为 [base + index*scale + disp],中的变址(连带比例因子)与偏移量不可兼得。

STR    Rd, [Rbase]          存储 Rd 到 Rbase 所包含的有效地址。STR    Rd, [Rbase, Rindex]  存储 Rd 到 Rbase + Rindex 所合成的有效地址。 STR    Rd, [Rbase, #index]  存储 Rd 到 Rbase + index 所合成的有效地址。index 是一个立即值。例如,STR Rd, [R1, #16] 将把 Rd 存储到 R1+16。STR    Rd, [Rbase, Rindex]! 存储 Rd 到 Rbase + Rindex 所合成的有效地址,并且把这个新地址写回到 Rbase。STR    Rd, [Rbase, #index]! 存储 Rd 到 Rbase + index 所合成的有效地址,并且并且把这个新地址写回到 Rbase。STR    Rd, [Rbase], Rindex  存储 Rd 到 Rbase 所包含的有效地址。把 Rbase + Rindex 所合成的有效地址写回 Rbase。STR    Rd, [Rbase, Rindex, LSL #2] 存储 Rd 到 Rbase + (Rindex * 4) 所合成的有效地址。STR    Rd, place            存储 Rd 到 PC + place 所合成的有效地址。
你当然可以在这些指令上使用条件执行。但要注意条件标志要先于字节标志,所以如果你希望在结果是等于的时候装载一个字节,要用的指令是LDREQB Rx, (不是LDRBEQ...)。

如果你指定预先变址寻址(这里的基址和变址都在方括号中),用是否存在‘!’来控制写回操作。上面的第4和第5个例子中使用了这个标志。你可以使用它来在内存中自动正向或反向移动。一个字符串打印例程将变成:

.loopLDRB   R0, [R1, #1]!SWI    "OS_WriteC"CMP    R0, #0BNE    loop
而不是:
.loopLDRB   R0, [R1]SWI    "OS_WriteC"ADD    R1, R1, #1CMP    R0, #0BNE    loop

对于过后变址寻址‘!’是无效的(这里的变址在方括号外面,比如上面的例子6),因为写回是暗含的。

如同你见到的那样,变址可以被移位来实现比例缩放。除此之外,可以从基址上减去偏移量。在这种情况下,你可以使用如下代码:

LDRB   R0, [R1, #-1]

尽管你可以存储或装载 PC,但你不可以用装载或存储指令来修改 PSR。要装载一个被存储的‘状态’并正确的恢复它,请使用:

LDR    R0, [Rbase]MOVS   R15, R0
假如你在有特权的模式下,MOVS 将导致 PSR 的位被更改。
对 PC 使用MOVS不遵从 32-bit 体系,你需要使用 MRS 和 MSR 来处理 PSR。

依照 ARM 汇编手册:

译注:下文所叙述内容针对的是小端字节序配置,对大端字节序配置在手册中另有专门叙述。

  • 如果提供的地址在一个字边界上,则字节装载(LDRB)使用在 0 至 7 位上的数据,如果在一个字地址加上一个字节上,则使用 8 至 15 位,以此类推。选择的字节被放入目标寄存器的低端 8 位中,并把寄存器中其余的位用零填充。
  • 字节存储(STRB)在数据总线上重复源寄存器的的低端 8 位 4 次。由外部的内存系统来激活适当的字节子系统来存储数据。
  • 字装载(LDR)或字存储(STR)将生成一个字对齐的地址。使用一个非字对齐的地址将有不明显和未规定的结果。实际上提示的是你不能使用 LDR 从一个非对齐的地址装载一个字。

 

传送多个数据

使用多数据传送指令(LDM 和 STM)来装载和存储多个字的数据从/到内存。

LDM/STM 的主要用途是把需要保存的寄存器到栈上。如我们以前见到过的STMFD R13!, {R0-R12, R14}。

指令格式是:

xxM{条件}{类型}  Rn{!}, <寄存器列表>{^}

‘xx’是 LD 表示装载,或 ST 表示存储。

再加 4 种‘类型’就变成了 8 个指令:

栈        其他LDMED     LDMIB     预先增加装载LDMFD     LDMIA     过后增加装载LDMEA     LDMDB     预先减少装载LDMFA     LDMDA     过后减少装载 STMFA     STMIB     预先增加存储STMEA     STMIA     过后增加存储STMFD     STMDB     预先减少存储STMED     STMDA     过后减少存储
指令格式

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top