ARM汇编之寻址方式
转自:http://blog.csdn.net/tigerjb/article/details/6186553
注:原文有图解说明还是去看原文吧
ARM7处理器有两个指令集:32位的ARM指令集,16位的Thumb指令集。
1> ARM指令集:效率高,代码密度高
2> Thumb指令集:具有较高的代码密度。
注:
- 所有的ARM指令集都是有条件执行的,而Thumb指令集仅有一条指令具备条件执行功能。
- ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。
二. ARM处理器寻址方式
寻址方式是指根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM7处理器总共有9中基本的寻址方式。
1. 寄存器寻址
1> 操作数的值存放在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。
2> MOV R1,R2
将R2寄存器中的值存放到R1寄存器中
3. 寄存器移位寻址
1> 操作数2先进行移位操作,然后再与第一个操作数进行操作。
2> MOV R0,R1,LSL #3
将R1的值左移三位,然后将结果放入R0中。等价于R0=R1*23
4. 寄存器间接寻址
1> 指令中的地址码给出的是一个通用寄存器的编号,指令所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
2> LDR R1,[R2]
将R2指向的存储单元中的数据读出保存在R1中。
5. 基址寻址
1> 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。
2> 基址寻址用于访问基址附件的存储单元,常用于查表和数组操作。
3> LDR R2,[R3,#0X0C]
读取R3+0X0C地址处的数据存放 到R2寄存器中。
6. 多寄存器寻址
1> 多寄存器寻址一次可传送n个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。
2> LDMIA R1! ,{R2-R4,R6}
将R1和R1之后寄存器中的值读出保存到R2-R4,和R6中。其中R1每次自加一。
7. 堆栈寻址
1> 堆栈寻址是隐含的,它使用一个专门的寄存器(堆指针)指向一块存储区域(堆栈)。指针所指向的存储单元即是堆栈的栈顶。
2> 存储器堆栈可分为两种
- 向上生长:向高地址方向生长,称为递增堆栈。
- 向下生长:向低地址方向生长,称为递减堆栈。
3> 按堆栈指针的执行顺序分为
- 满堆栈:堆栈指针指向最后压入堆栈的有效数据。
<即当有数据入堆栈时,栈顶指针先加一,然后数据入栈
- 空堆栈: 堆栈指针指向下一个待压入数据的空位置。
<即当有数据入堆栈时,数据先入栈,然后栈顶指针在加一>
8. 相对寻址
相对寻址是基址寻址的另一种形式。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即操作数的有效地址。
9. 立即寻址
1> 立即寻址中,操作码字段后面的部分不是操作数地址而是操作数本身。
2> MOV R0,#0XAA
将立即数0XAA存放到寄存器R0中。