ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
2017-12-04 10:48
369 查看
http://blog.csdn.net/u013477200/article/details/50723555
ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRH
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:— LDR 字数据加载指令
— LDRB 字节数据加载指令
— LDRH 半字数据加载指令
— STR 字数据存储指令
— STRB 字节数据存储指令
— STRH 半字数据存储指令
1、LDR指令
LDR指令的格式为:LDR{条件} 目的寄存器,<存储器地址>
LDR
指令用于从存储器中将一个
32
位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取
32
位的字数据到通用寄存器,然后对数据进行处理。当程序计数器
PC
作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。
指令示例:
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
2、LDRB指令
LDRB指令的格式为:LDR{条件}B 目的寄存器,<存储器地址>
LDRB
指令用于从存储器中将一个
8
位的字节数据传送到目的寄存器中,同时将寄存器的高
24
位清零。该指令通常用于从存储器中读取
8
位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器
PC
作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
指令示例:
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。
3、LDRH指令
LDRH指令的格式为:LDR{条件}H 目的寄存器,<存储器地址>
LDRH
指令用于从存储器中将一个
16
位的半字数据传送到目的寄存器中,同时将寄存器的高
16
位清零。该指令通常用于从存储器中读取
16
位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器
PC
作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
指令示例:
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。
4、LDM指令:
L的含义仍然是LOAD,即是Loadfrom memory into register。
虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:
LDMFD SP!
, {R0, R1, R2}
实际上可以理解为: LDMFD [SP]!, {R0,
R1, R2}
意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去。
5、STR指令
STR指令的格式为:STR{条件} 源寄存器,<存储器地址>
STR
指令用于从源寄存器中将一个
32
位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令
LDR
。
指令示例:
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。
6、STRB指令
STRB指令的格式为:STR{条件}B 源寄存器,<存储器地址>
STRB
指令用于从源寄存器中将一个
8
位的字节数据传送到存储器中。该字节数据为源寄存器中的低
8
位。
指令示例:
STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。
STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。
7、STRH指令
STRH指令的格式为:STR{条件}H 源寄存器,<存储器地址>
STRH
指令用于从源寄存器中将一个
16
位的半字数据传送到存储器中。该半字数据为源寄存器中的低
16
位。
指令示例:
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。
STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。
8、STM指令:
S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。STMFD SP!, {R0}
同样的,该指令也可理解为: STMFD [SP]!, {R0}
意思是:把R0保存到堆栈(sp指向的地址)中。
相关文章推荐
- ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
- ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
- ARM LDR/STR, LDM/STM 指令
- arm汇编中ldr、str、stm、ldm的用法
- 内存访问指令:ldr、str、ldm、stm
- 1.20.ARM汇编指令集8之存储器访问指令(LDM和STM & SWP)
- arm汇编:ldr,str,ldm,stm,伪指令ldr
- 1.2.19、ARM汇编指令集:ldm/stm与栈的处理
- 汇编LDR、LDM和STR、STM的区别
- ARM的六大类指令集--- 加载/存储指令
- ARM指令中STM和LDM的理解误区
- arm汇编指令之数据块传输(LDM,STM)
- ARM的六大类指令集
- ARM的六大类指令集---跳转指令
- arm汇编指令之数据块传输(LDM,STM)详见
- arm汇编指令之数据块传输(LDM,STM)详解
- arm 汇编指令:内存访问方式 、STR 、LDR 指令
- arm汇编指令之数据块传输(LDM,STM)详见
- arm str ldr case
- arm汇编编写countnum加1的实现(LDR STR ADD 指令)