简介
- ARM基于精简指令集RISC
- 有32位ARM指令集和16位Thumb指令集,ARM指令集效率高代码密度低,Thumb密度较高,是ARM的子集
- 所有ARM指令可有条件执行,而Thumb指令仅有一条指令(跳转指令)有条件执行功能
- 两种指令集下的程序可相互调用
寻址方式分类
寄存器寻址
操作数保存在寄存器中,地址码字段是寄存器编号
MOV R1,R2
将R2的值存入R1-
立即寻址
操作码字段后面的地址码部分就是操作数本身,操作数是指令的一部分
-
寄存器移位寻址
第二个操作数是寄存器移位方式
MOV R0,R2,LSL #3
R2的值左移3位,放入R0ANDS R1,R1,R2,LSL R3
R2的值左移R3里的数的位,并于R1相与存在R1中寄存器间接寻址
所需的操作数保存在寄存器指定地址的存储单元中,寄存器相当于指针了
LDR R1,[R2]
将R2指向的存储单元的数据读出,保存在R1中SWP R1,R1,[R2]
将R1的值和R2指定的寄存器中的值交换基址寻址
将基址寄存器的内容与指令中给出的偏移量相加,即指针+偏移量
LDR R2,[R3,#0x0C]
读取R3+0x0C地址上的存储单元的内容存入R2,但不改变R3中的值STR R1,[R0,#-4]!
将R1保存在R0-4指向的内存单元中,并更新R0中的值多寄存器寻址
一次传送几个寄存器值,寄存器列表中的寄存器数不能多于16个,排列必须由大到小
LDMIA R1!,{R2-R7,R12}
将R1指向的单元中的数据读出到R2~R7,R12中,每读出一个R1自动加4堆栈寻址
后进先出
- 堆栈寻址是隐含的,使用一个专门的寄存器(堆栈指针),指针指向栈顶
- 生长方式分两种
- 向上生长:向高地址生长
- 向下生长:向低地址生长
- 堆栈两种形式
- 满堆栈:指针指向的是最后压入堆栈的有效数据项
- 空堆栈:指针指向的是下一个待压入数据的空位置
组合有四种堆栈的工作方式
STMIA R0!,{R1-R7}
将R1-R7的数据存储到R0指向的地址空间中,每次R0,递增相对寻址
基址寻址的变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量