ARM处理器指令集
3.1指令简介
-
指令
定义:能够指示处理器执行某种运算的命令(如加、减、乘、.......) -
程序是指令的有序集合。
-
指令集
定义:处理器能识别指令的集合,称为指令集 -
ARM指令在汇编程序中用助记符表示,格式为:
<opcode>{<cond>} {S} <Rd>,<Rn> {,<operand2> }
说明:
指令操作码,如ADD表示算术加操作指令; - {
}决定指令执行的条件码; - {S}是否更新CPSR中的标志位值,写时更新 ,否则不更新;
目的寄存器编码; 包含第一个操作数的寄存器编码; 第二个操作数,有2种形式: #immed_8r;
-
指令格式举例:
LDR R0,[R1]
将存储器地址为R1的字数据读入寄存器 R0,执行条件AL (总是,可以省略)
ADDS R1, R1, #1
加法指令, R1= R1+1, 带S,执行完指令,同时更新CPSR寄存器条件标志位
SUBNES R1, R1, #0xF
条件执行减法运算(NE), R1=R1-0XF, 带S则影响CPSR 寄存器
3.2ARM寻址方式
-
立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址
-
立即寻址
立即寻址也叫 立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为 立即数
例如以下指令:
ADD R0,R0,#1
/R0←R0+1/
ADD R0,R0,#0x3f
/R0←R0+0x3f/- 立即数写法:第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”;“0b”或“%”表示二进制;“0d”或缺省不写表示十进制。立即数一般为 8位。
-
寄存器寻址
利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:
ADD R0,R1,R2
/R0←R1+R2/该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
-
寄存器间接寻址
寄存器间接寻址:以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDR R0,[R1]
/R0←[R1]/
STR R0,[R1]
/[R1]←R0/LDR(Load Register):将以R1的值为地址的存储器中的数据加载到R0中;
STR(Store Register):将R0的值传送到以R1的值为地址的存储器中。 -
基址加偏址寻址
基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作.如下所示:LDR r0,[r1,r2];
r0<—mem32[r1+r2]
LDR r0,[r1,r2,LSL #2];
r0<—[r1+r2*4]但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用
-
堆栈寻址
堆栈:一个按操作顺序进行存取的存储区(一种数据结构);
操作顺序:先进后出(First In Last Out,FILO);
使用一个称作堆栈指针的专用寄存器(SP)指示当前的操作位置,堆栈指针总指向堆栈存储单元的栈顶。四种类型的堆栈工作方式
- 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成;
- 满递减堆栈 (FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成(默认寻址方式);
- 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
- 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
ARM无专门的堆栈操作指令
-
快拷贝寻址
-
相对寻址
3.3ARM指令集详细介绍
- ARM的数据处理指令主要完成寄存器中数据的 算术和逻辑运算操作。
省略
习题
-
简述 ARM处理器指令集的特点。
代码灵活度高;
简化了复杂度;
执行指令集时PC每次自增4 -
ARM处理器指令集的寻址方式有哪些,数据的存储方式有那些?
立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址 -
简述堆栈寻址方式的分类.
堆栈:一个按操作顺序进行存取的存储区(一种数据结构);
操作顺序:先进后出(First In Last Out,FILO);
使用一个称作堆栈指针的专用寄存器(SP)指示当前的操作位置,堆栈指针总指向堆栈存储单元的栈顶。四种类型的堆栈工作方式
- 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成;
- 满递减堆栈 (FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成(默认寻址方式);
- 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
- 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
-
编写指令实现以下功能:
(1)将数值 0x80 存入R6;
MOV R6, #0x80
(2)将寄存器 APSR 读取存入R5;
MRS R5, APSR
(3)将数值 0.5存入R2,并更新标志位;
VMOV.F32 S2, #0.5
VMRS APSR_nzcv, FPSCR
(4)将数值0x12345678存入R2。
LDR R2, =0x12345678
-
编写存储器访问指令实现以下功能:
(1)从存储器地址[R2+16]中取有符号半字数送入R2,并将R2更新为R2+16;
LDRSH R2, [R2, #16]
ADD R2, R2, #16
(2)将RO中的字数据存入地址为[R1+R2x4]的存储单元中;
STR R0, [R1, R2, LSL #2]
(3)从存储器地址[R6]中取1字节数值,送入R5中,并将R6更新为R6+0x22;
LDRB R5, [R6]
ADD R6, R6, #0x22
(4)将PC+6指向的存储器的字数据送入R1中。
LDR R1, [PC, #6]
-
采用两种指令编写实现将寄存器R2、R4、R5、R6、R8内容进栈保存。
使用STMFD指令将寄存器R2、R4、R5、R6、R8内容进栈保存
STMFD SP!, {R2, R4, R5, R6, R8}
使用PUSH指令将寄存器R2、R4、R5、R6、R8内容进栈保存
PUSH {R2, R4, R5, R6, R8}
-
分别使用条件跳转指令和IT指令编写程序段实现以下功能:比较寄存器 RO与R1,相等时,RO逻辑右移2位,R1循环右移2位;不等时,R0算术右移2位,R1带进位循环右移 2位。
-
编写程序段不使用乘法指令实现将寄存器R6的内容乘以9,并将其结果存入寄存器 R7内