Android ARM 指令学习
位寻址
LSL :逻辑左移->移位后寄存器空出的低位补0
LSR:逻辑右移->移位后寄存器空出的高位补0
例如:
MOVR0 ,R1,LSL #2 表示:指令的功能是将R1寄存器左移2位,即“R1<2” 后赋值给R0寄存器,指令执行后R0=R1*4;
4,寄存器间接寻址
例如:寄存器间接寻址码给出寄存器是操作数的地址指针,所需的操作数保存在寄存器指定地址的存储单元
中,
例如:
LDRR0 ,[R1]
指令功能是将R1寄存器的数值作为地址,取出地址中的值赋值给R0寄存器。
5,基址寻址
基址寻址是将地址码给出的寄存器与偏移量相加,形成操作数的有效地址,所需的操作数保存在有效地址所指向的存储单元中,基址寻址多用于查表,数组访问等操作,
例如:LDRR0 ,[R1,#-4]
指令的功能是 将R1寄存器的数值减4作为地址,取出此地址的值赋值给R0寄存器。
6,多寄存器寻址
多寄存器寻址一条指令最多可以完成16个通用寄存器值得传递
LDMIAR0,{R1,R2,R3,R4}
LDM是数据加载指令,指令的后缀IA表示每次执行完加载操作后R0寄存器的值自增1个子,ARM中一个字表示的是一个字的32位数字(bit),这条指令执行后,R1=[R0],R2=[R0+#4]
R3=[R0+#8],R4=[R0+#12]
7,堆栈寻址
堆栈寻址是ARM处理器特有的一种寻址方式,堆栈寻址需要使用特定的指令来完成
堆栈寻址的指令由LDMFA/STMFA,LDMEA/STMEA,LDMFD/STMFD
FA,EA,FD,ED 为指令前缀,表示多寄存器寻址,即一次可以传递多个寄存器值,FA,EA,FD,ED,为后缀
堆栈寻址举例:
STMFD SP! {R1-R7,LR} @将R1~R7,LR入栈,多用于保持子线程“现场”
LDMFD SP! {R1-R7,LR} @将数据出栈,放入R1~R7,LR寄存器,恢复子程序“现场”
8,块拷贝寻址
块拷贝寻址可以实现连续地址数据从寄存器的莫某一位置拷贝到另一位置,
块拷贝寻址的指令由
LDMIA/STMIA,LDMDA/STMDA/LDMIB/STMIB
LDM和STM为指令前缀,表示多寄存器寻址,即一次可以传递多个寄存器值,IA,DA,IB,DB为后缀,
块拷贝举例
LDMIA R0! ,{R1-R3} @从R0寄存器指向的存储单元中读取3个子到R1-R3寄存器
STMIA R0! ,{R1-R3} @存储R1-R3寄存器的内容到R0寄存器指向的存储单元
9,相对寻址
相对寻址以程序计数器PC当前值为级地址,指令中的地址中的标号作为偏移量,将两者相加后得到操作数的有效地址
BL NEXT
...
NEXT :
....
BL NEXT 是跳转到NEXT标号处执行,这里BL采用的就是相对寻址,标号NEXT 就是偏移量。
待续...
AndroidARM指令学 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)