微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 很好的 ARM指令集解析

很好的 ARM指令集解析

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

传送地址,可使用这种方法自动修改基址寄存器,如:

LDR R5,[R6,#0x04]!

3】后索引:后索引也被称为后变址,后索引就是用基址寄存器的地址值寻址,找出操作数进行操作,操作完成后,再把地址偏移量和基址相加/减,结果送到基址寄存器,作为下一次寻址的基址。如:

LDR R5,[R6],#0x04

STR R6,[R7],#-0x08

4、单寄存器加载和存储指令:LDR/STR、LDRB/STRB、LDRH/STRH、LDRSB/LDRSH

1】字数据加载/存储指令格式:

31~28 | 27~26 |2524 23 22 2120| 19~16 | 15~12 | 11~0

cond | 01 | I P U B W L | Rn | Rd | Op2

cond:指令执行的条件编码

I、P、U、W:用于区别不同的地址模式(偏移量)。

I为0时,偏移量为12位立即数;I为1时,偏移量为移位寄存器移位

P表示前/后索引

U表示加/减

W表示回写

L:L为1时表示加载,L为0时表示存储

B:B为1表示字节访问,B为0表示字访问

Rd:源/目标寄存器

Rn:基址寄存器

Op2:表示偏移量是一个12位的无符号二进制数,与Rn一起构成地址addr

2】存储器<==>寄存器 LDR/STR

LDR指令用于从存储器中间一个32位的字数据加载到目的寄存器Rd中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当做目的地址,从而实现程序流程的跳转。

LDR R4,START ;将存储地址为START的字数据读入R4

STR R5,DATA1 ;将R5存入存储地址为DATA1中

LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0

LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0

LDR R0,[R1,#8] ;将寄存器R1+8的内容读入寄存器R0

LDR R0,[R1,R2,LSL #2] ;将R1+R2*4的字数据读入寄存器R0

STR R0,[R1,R2]! ;将R0字数据存入存储器地址为R1+R2的存储单元中,

并将新地址R1+R2写入R1

STR R0,[R1,#8]! ;将R0字数据存入存储器地址为R1+8的存储单元中,

并将新地址R1+8写入R1

STR R0,[R1,R2,LSL #2]! ;将R0字数据存入地址为R1+R2*4的存储单元中,

并将新地址R1+R2*4写入R1

LDR R0,[R1],#8 ;将存储器地址为R1的字数据读入寄存器R0,

并将新地址R1+8写入R1

LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,

并将新地址R1+R2写入R1

LDR R0,[R1],R2,LSL #2 ;将存储器地址为R1的字数据读入寄存器R0,

并将新地址R1+R2*4写入R1

注意事项:

a、立即数绝对值不大于4095的数值,可使用带符号数,即在-4095 ~ +4095之间。(4096D = 1000H)

b、语句的标号不能指向程序存储器的程序存储区,而是指向程序存储器的数据存储区或数据存储器的数据存储区。另外指向的区域是可修改的。例如,在用户模式下,有些存储区是不能访问的或是只读的。

c、字传送时,偏移量必须保证偏移的结果能够使地址对齐。

d、使用寄存器移位的方法计算偏移量时。移位的位数不能超过规定的数值,而且不能用寄存器表示移位的位数。各类移位指令的移位位数规定如下:

ASR #n:算术右移(1≤n≤32)

LSL #n:逻辑左移(0≤n≤31)

LSR #n:逻辑右移(1≤n≤32)

ROR #n:循环右移(1≤n≤31)

e、R15作为基址寄存器Rn时,不可以使用回写功能,即使用后缀“!”,另外,R15不可作为偏移寄存器使用。

5、字节数据加载/存储指令:LDRB/STRB

LDRB指令用于从存储器中将一个8位字节的数据加载到目的寄存器,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器读取的数据被当做目的地,从而可以实现程序流程的跳转

STRB指令用于从源寄存器中将一个8位的字节数据存储到存储器中,该字节数据为源寄存器的低8位,STRB指令和LDRB指令的区别在于数据的传送方向。

LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,

并将R0的高24位清零。

LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,

并将R0的高24位清零。

STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

6、LDRH/STRH 半字数据加载/存储指令

31~28| 27~25|24 23 22 2120| 19~16|15~12|11~8 | 7 6 5 4 | 3~0

cond | 000 | P U I W L| Rn | Rd |addr_H |1 S H 1 |addr_L

cond:指令执行的条件编码

I、P、U、W:用于区别不同的地址模式(偏移量)。I为0时,偏移量为8位立即数,I为1时,偏移量为寄存器移位。P表示前/后变址,U表示加/减,W表示回写。

L

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

网站地图

Top