很好的 ARM指令集解析
:为1表示加载,为0表示存储。
S:用于区别有符号访问(S为1)和无符号访问(S为0)
H:用于区别半字访问(H为1)或字节访问(H为0)
Rd:源/目标寄存器
Rn:基址寄存器
addr
I为1时,偏移量为寄存器移位addr
LDR指令用于从寄存器中间一个16位的半字数据加载到目的寄存器Rd中,同时将寄存器的高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位清零
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中
使用半字加载/存储指令需要注意的事项:
(1)必须半字地址对齐。
(2)对于R15的使用需要慎重,R15作为基址寄存器Rn时,不可以使用回写功能,不可使用R15作为目的寄存器。
(3)立即数偏移使用的是8位无符号数。
(4)不能使用寄存器移位寻址
7、有符号数字节/半字加载指令:LDRSB / LDRSH
LDRSB指令用于从存储器中间一个8位的字节数据加载到目的寄存器中,同时将寄存器的高24位设置为该字节数据的符号位的值,即将该8位字节数据进行符号位的扩展,生成32位数据;LDRSH指令用于从存储器中将一个16位的半字数据加载到目的寄存器Rd中,同时将寄存器的高16位设置为该字数据的符号位的值,即将该16位字数据进行符号位的扩展,生成32位数据。
LDRSB R0,[R1,#4] ;将存储地址为R1+4的有符号字节数据读入R0,
R0中的高24位设置为高字节数据的符号位
LDRSH R6,[R2],#2 ;将存储地址为R2+2的有符号半字数据读入R6,
R6的高16位设置成该字节数据的符号位,R2=R2+2
8、多寄存器加载和存储指令:LDM / STM
LDM指令用于从基址寄存器所指示的一片连续存储器中读取数据到寄存器列表所指示的多个寄存器中,内存单元的其实地址为基址寄存器Rn的值,各个寄存器有寄存器列表regs表示。该指令一般用于多个寄存器数据的出栈操作;STM指令用于将寄存器列表所指示的多个寄存器的值存入到由基址寄存器所指示的一片连续存储器中,内存单元的其实地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。指令的其它参数的用法和LDM指令是相同的。该指令一般用于多个寄存器数据的进栈操作。
type类型。用于数据的存储和读取有一下几种情况:
IA 每次传送后地址值加
IB 每次传送前地址值加
DA 每次传送后地址值减
DB 每次传送前地址值减
对于堆栈操作有如下几种情况:
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 满递增堆栈
{ !
{ ^ }为可选后缀,当治疗为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常数据加载和存储之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
LDMIA R0!,{R6-R8} ;R6 <- [R0],R7 <- [R0+4],R8 <- [R0+8],R0 <- R0+12
LDMIB R0!,{R6-R8} ;R6 <- [R0],R7 <- [R0+4],R8 <- [R0+8],R0 <- R0+8
9、堆栈和堆栈操作
堆栈就是在RAM存储器中开辟(指定)的一个特定的存储区域,在这个区域中,信息的存入(此时称为推入)与取出(此时称为弹出)的原则不再是“随机存取”,而是按照“后进先出”的原则就行存取。
A】建栈:规定堆栈底部在RAM存储器中的位置,如:用户可以通过LDR命令设置SP的值来建立堆栈。
LDR R13,=0x90010 ;
LDR SP,=0x90010 ;
这时,SP指向地址0x90010,栈内无数据,堆栈底部与顶部重叠,是一个空栈。
B】进栈:STM指令配合FD(满递减)、ED(空递减)、FA(满递增)、EA(空递增)完成入栈操作。在使用一个堆栈的时候,需要确定堆栈在存储器空间中是向上生长还是向下生长的。向上称为递增,向下称为递减。
STMFD SP!,{R2-R4} ;把R4,R3,R2的值依次压栈(标号高的存在高地址)
LDMFD SP!,{R6-R8} ;把R2,R3,R4的值,依次退到R6,R7,R8
:
SWP交换指令,B指令,MRS/MSR指令,协处理器指令,伪指令等未补充,待更新。。。
ARM指令集解 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)