微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 数据传送指令之:单寄存器的Load/Store指令

数据传送指令之:单寄存器的Load/Store指令

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

LDR r1,[r0,#0x12] ;将r0+12地址处的数据读出,保存到r1中(r0的值不变)

LDR r1,[r0] ;将r0地址处的数据读出,保存到r1中(零偏移)

LDR r1,[r0,r2] ;将r0+r2地址的数据读出,保存到r1中(r0的值不变)

LDR r1,[r0,r2,LSL #2] ;将r0+r2×4地址处的数据读出,保存到r1中(r0,r2的值不变)

LDR Rd,label ;label为程序标号,label必须是当前指令的±4KB范围内

LDR Rd,[Rn],#0x04 ;Rn的值用作传输数据的存储地址。在数据传送后,将偏移量0x04与

Rn相加,结果写回到Rn中。Rn不允许是r15

注意

地址对齐问题:大多数情况下,必须保证用于32位传送的地址是32位对齐的。

2.STR指令

(1)指令编码格式

STR指令用于将一个32位的字数据写入到指令中指定的内存单元。

指令的编码格式如图5.4所示。

图5.4 STR指令编码格式

(2)指令的语法格式

STR{cond>} Rd>,addr_mode>

① cond>

为指令编码中的条件域。它指示STR指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。

② Rd>

确定使用哪个通用寄存器作为目标寄存器。

③ addr_mode>

它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。

(3)指令操作的伪代码

指令操作的伪代码如下面程序段所示。

If ConditionPassed{cond} then

Memory[address,4]=Rd

(4)指令举例

LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等等,若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。

① 变量访问

NumCount EQU 0x40003000 ;定义变量NumCount

LDR R0,=NumCount ;使用LDR伪指令装载NumCount的地址到R0

LDR R1,[R0] ;取出变量值

ADD R1,R1,#1 ;NumCount=NumCount+1

STR R1,[R0] ;保存变量

② GPIO设置

GPIO—BASE EQU 0xe0028000 ;定义GPIO寄存器的基地址

……

LDR R0,=GPIO—BASE

LDR R1,=0x00ffff00 ;将设置值放入寄存器

STR R1,[R0,#0x0C] ;IODIR=0x00ffff00,IOSET的地址为0xE0028004

③ 程序散转

MOV r2,r2,LSL #2 ;功能号乘以4,以便查表

LDR PC,[PC,r2] ;查表取得对应功能子程序地址,并跳转

NOP

FUN—TAB DCD FUN—SUB0

DCD FUN—SUB1

DCD FUN—SUB2

5.3.2 字节数据传送指令(LDRB/STRB)

1.LDRB指令

(1)指令编码格式

LDRB指令根据addr_mode>所确定的地址模式将一个8位字节读取到指令中的目标寄存器Rd>。

指令的编码格式如图5.5所示。

图5.5 LDRB指令编码格式

注意

LDRB指令加载一个内存地址的8位字节到一个通用寄存器中。寄存器的高位数据补0。

(2)指令的语法格式

LDR{cond>}B Rd>,addr_mode>

① cond>

为指令编码中的条件域。它指示LDRB指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。

② Rd>

确定使用哪个通用寄存器作为目标寄存器。

③ addr_mode>

它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。

(3)指令操作的伪代码

if ConditionPassed{cond} then

Rd = Memory[address,1]

注意

当PC作为位基地址出现在指令中时,指令中将会使用PC相关地址,使用这种方法可以编写自己的位置无关(position-independ)指令。

2.STRB指令

(1)指令编码格式

STRB指令从寄存器中取出指定的8位字节放入寄存器的低8位,并将寄存器的高位补0。

指令的编码格式如图5.6所示。

图5.6 STRB指令编码格式

(2)指令的语法格式

STR{cond>}B Rd>,addr_mode>

① cond>

为指令编码中的条件域。它指示STRB指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。

② Rd>

确定使用哪个通用寄存器作为目标寄存器。

注意

当PC作为目标寄存器Rd>出现在指令中时,指令的执行结果不可预知。

③ addr_mode>

它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。

(3)指令操作的伪代码

if ConditionPassed{cond} then

Memory[address,1] = Rd[7:0]

5.3.3 半字数据传送指令(LDRH/STRH)

1.LDRH指令

(1)指令编码格式

LDRH指令用于从内存中将一个16位的半字读取到目标寄存器。

如果指令的内存地址不是半字节对齐的,指令的执行结果不可预知。

指令的编码格式如图5.7所示。

图5.7 LDRH指令的编码格式

(2)指令的语法格式

LDR{cond>}H Rd>,addr_mode>

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

网站地图

Top