加载/存储指令
2011-01-11 11:25
204 查看
加载/存储指令
[align=left]ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:[/align]
[align=left] [/align]
[align=left]1、LDR 指令[/align]
[align=left]LDR 指令的格式为:[/align]
[align=left]LDR{条件} 目的寄存器,<存储器地址>[/align]
[align=left]LDR 指令用于从存储器中将一个32 位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。[/align]
[align=left]指令示例:[/align]
[align=left]LDR R0,[R1] ;将存储器地址为R1 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,R2] ;将存储器地址为R1+R2 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,#8] ;将存储器地址为R1+8 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,R2]! ;将存储器地址为R1+R2 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。[/align]
[align=left]LDR R0,[R1,#8]! ;将存储器地址为R1+8 的字数据读入寄存器R0,并将新地址R1+8 写入R1。[/align]
[align=left]LDR R0,[R1],R2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。[/align]
[align=left]LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。[/align]
[align=left]LDRR0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。[/align]
[align=left] [/align]
[align=left]2、LDRB 指令[/align]
[align=left]LDRB 指令的格式为:[/align]
[align=left]LDR{条件}B 目的寄存器,<存储器地址>[/align]
[align=left]LDRB 指令用于从存储器中将一个8 位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8 位的字节数据到通用寄存器,然后对数据进行处理。[/align]
[align=left]当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。[/align]
[align=left]指令示例:[/align]
[align=left]LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。[/align]
[align=left]LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。[/align]
[align=left] [/align]
[align=left]3、LDRH 指令[/align]
[align=left]LDRH 指令的格式为:[/align]
[align=left]LDR{条件}H 目的寄存器,<存储器地址>[/align]
[align=left]LDRH 指令用于从存储器中将一个16 位的半字数据传送到目的寄存器中,同时将寄存器的高16 位清零。该指令通常用于从存储器中读取16 位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。[/align]
[align=left]指令示例:[/align]
[align=left]LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left]LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left]LDRHR0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left] [/align]
[align=left]4、STR 指令[/align]
[align=left]STR 指令的格式为:[/align]
[align=left]STR{条件} 源寄存器,<存储器地址>[/align]
[align=left]STR 指令用于从源寄存器中将一个32 位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。[/align]
[align=left]指令示例:[/align]
[align=left]STR R0,[R1],#8 ;将R0 中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。[/align]
[align=left]STR R0,[R1,#8] ;将R0 中的字数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
[align=left]5、STRB 指令[/align]
[align=left]STRB 指令的格式为:[/align]
[align=left]STR{条件}B 源寄存器,<存储器地址>[/align]
[align=left]STRB 指令用于从源寄存器中将一个8位的字节数据传送到存储器中,该字节数据为源寄存器中的低8位。[/align]
[align=left]指令示例:[/align]
[align=left]STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。[/align]
[align=left]STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
[align=left]6、STRH 指令[/align]
[align=left]STRH 指令的格式为:[/align]
[align=left]STR{条件}H 源寄存器,<存储器地址>[/align]
[align=left]STRH 指令用于从源寄存器中将一个16位的半字数据传送到存储器中,该半字数据为源寄存器中的低16 位。[/align]
[align=left]指令示例:[/align]
[align=left]STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。[/align]
[align=left]STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
变量的访问:
NumCount EQU 0x40003000 ;定义变量
…..
LDR R0, =NumCount ;使用LDR伪指令装载NumCount的地址到R0
LDR R1, [R0]
ADD R1, R1, #1
STR R1, [R0]
GPIO 设置:
GPIO-BASE EQU 0xe0028000 ;定义GPIO寄存器基地址
…..
LDR R0, =GPIO-BASE
LDR R1, =0x00ffff00 ;装载32位立即数, GPIO设置值
STR R1, [R0, #0x0c] ;IODIR = 0x00ffff00, IODIR的地址为0xe002800c
MOV R1, #0x00f00000
STR R1, [R0, #0x04] ;IOSET = 0x00f00000
……
程序散转:
…….
MOV R2, R2, LSL #2 ;功能号乘上4,以便查表
LDR PC, [PC, R2] ;查表取得对应功能子程序地址,并跳转
NOP
FUN-TAB DCD FUN-SUB0
DCD FUN-SUB1
DCD FUN-SUB2
…….
[align=left]ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:[/align]
[align=left] [/align]
[align=left]1、LDR 指令[/align]
[align=left]LDR 指令的格式为:[/align]
[align=left]LDR{条件} 目的寄存器,<存储器地址>[/align]
[align=left]LDR 指令用于从存储器中将一个32 位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。[/align]
[align=left]指令示例:[/align]
[align=left]LDR R0,[R1] ;将存储器地址为R1 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,R2] ;将存储器地址为R1+R2 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,#8] ;将存储器地址为R1+8 的字数据读入寄存器R0。[/align]
[align=left]LDR R0,[R1,R2]! ;将存储器地址为R1+R2 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。[/align]
[align=left]LDR R0,[R1,#8]! ;将存储器地址为R1+8 的字数据读入寄存器R0,并将新地址R1+8 写入R1。[/align]
[align=left]LDR R0,[R1],R2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。[/align]
[align=left]LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。[/align]
[align=left]LDRR0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。[/align]
[align=left] [/align]
[align=left]2、LDRB 指令[/align]
[align=left]LDRB 指令的格式为:[/align]
[align=left]LDR{条件}B 目的寄存器,<存储器地址>[/align]
[align=left]LDRB 指令用于从存储器中将一个8 位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8 位的字节数据到通用寄存器,然后对数据进行处理。[/align]
[align=left]当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。[/align]
[align=left]指令示例:[/align]
[align=left]LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。[/align]
[align=left]LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。[/align]
[align=left] [/align]
[align=left]3、LDRH 指令[/align]
[align=left]LDRH 指令的格式为:[/align]
[align=left]LDR{条件}H 目的寄存器,<存储器地址>[/align]
[align=left]LDRH 指令用于从存储器中将一个16 位的半字数据传送到目的寄存器中,同时将寄存器的高16 位清零。该指令通常用于从存储器中读取16 位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。[/align]
[align=left]指令示例:[/align]
[align=left]LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left]LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left]LDRHR0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。[/align]
[align=left] [/align]
[align=left]4、STR 指令[/align]
[align=left]STR 指令的格式为:[/align]
[align=left]STR{条件} 源寄存器,<存储器地址>[/align]
[align=left]STR 指令用于从源寄存器中将一个32 位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。[/align]
[align=left]指令示例:[/align]
[align=left]STR R0,[R1],#8 ;将R0 中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。[/align]
[align=left]STR R0,[R1,#8] ;将R0 中的字数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
[align=left]5、STRB 指令[/align]
[align=left]STRB 指令的格式为:[/align]
[align=left]STR{条件}B 源寄存器,<存储器地址>[/align]
[align=left]STRB 指令用于从源寄存器中将一个8位的字节数据传送到存储器中,该字节数据为源寄存器中的低8位。[/align]
[align=left]指令示例:[/align]
[align=left]STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。[/align]
[align=left]STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
[align=left]6、STRH 指令[/align]
[align=left]STRH 指令的格式为:[/align]
[align=left]STR{条件}H 源寄存器,<存储器地址>[/align]
[align=left]STRH 指令用于从源寄存器中将一个16位的半字数据传送到存储器中,该半字数据为源寄存器中的低16 位。[/align]
[align=left]指令示例:[/align]
[align=left]STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。[/align]
[align=left]STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。[/align]
[align=left] [/align]
变量的访问:
NumCount EQU 0x40003000 ;定义变量
…..
LDR R0, =NumCount ;使用LDR伪指令装载NumCount的地址到R0
LDR R1, [R0]
ADD R1, R1, #1
STR R1, [R0]
GPIO 设置:
GPIO-BASE EQU 0xe0028000 ;定义GPIO寄存器基地址
…..
LDR R0, =GPIO-BASE
LDR R1, =0x00ffff00 ;装载32位立即数, GPIO设置值
STR R1, [R0, #0x0c] ;IODIR = 0x00ffff00, IODIR的地址为0xe002800c
MOV R1, #0x00f00000
STR R1, [R0, #0x04] ;IOSET = 0x00f00000
……
程序散转:
…….
MOV R2, R2, LSL #2 ;功能号乘上4,以便查表
LDR PC, [PC, R2] ;查表取得对应功能子程序地址,并跳转
NOP
FUN-TAB DCD FUN-SUB0
DCD FUN-SUB1
DCD FUN-SUB2
…….
相关文章推荐
- ARM的批量加载/存储指令
- 基于prototype的动态加载js的一个类
- 动态加载js
- android异步加载图片
- iphone开发中使用动态库(dylib)和动态加载framework
- 高效加载大位图
- 一个java类的加载过程
- 在Android中实现ListView图片异步加载一
- 【opengL】glaux.h 库加载GlAux.lib的问题
- zend framework2 - 通过配置类加载提高性能
- JS实现图片预加载无需等待
- 类加载机制
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android下拉刷新上拉加载控件,对所有View通用!
- Canvas制作动态进度加载水球
- 微信切换界面延时加载的实现方法是优化ViewPager中加载Fragment
- Linux-execve时的文件加载流程
- PullToRefresh实现上拉刷新下拉加载
- 在.Net framework中动态加载Assembly的loadFromRemoteSources配置