很好的 ARM指令集解析
传送地址,可使用这种方法自动修改基址寄存器,如:
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 |
cond |
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指令用于从存储器中间一个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|
cond
cond:指令执行的条件编码
I、P、U、W:用于区别不同的地址模式(偏移量)。I为0时,偏移量为8位立即数,I为1时,偏移量为寄存器移位。P表示前/后变址,U表示加/减,W表示回写。
L
ARM指令集解 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)