六.指令系统
Cortex-A8采用ARMv7架构,包含:
1) 32位的ARM指令集
2) 16位和32位混合的Thumb-2指令集
3) ThumbEE指令集
主要内容包括:
(一).指令格式
ARM指令的基本格式如下:<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:
Ø opcode:指令助记符;
Ø cond:执行条件;
Ø S:是否影响CPSR寄存器的值;
Ø Rd:目标寄存器;
Ø Rn:第1个操作数的寄存器;
Ø operand2:第2个操作数;能够提高代码效率。它有如下的形式:
#immed_8r——常数表达式;该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。
MOV R0,#1
AND R1,R2,#0x0F
Rm——寄存器方式;在寄存器方式下,操作数即为寄存器的数值。
SUB R1, R1, R2
MOV PC, R0
Rm,shift——寄存器移位方式;将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下:
ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8=9R1
SUB R1,R1,R2,LSR R3 ;R1=R1-(R2/2R3)
(二).ARM指令集
32位ARM指令集由13种基本指令类型组成,分成四大类:
1) 3种类型的存储器访问指令。用于控制存储器和寄存器之间的数据传送。第一种类型用于优化的灵活寻址及交换数据;第二种类型用于快速上下文切换;第三种类型用于交换数据。
2) 3种类型的数据处理指令,使用片内的累加器(ALU)、桶形移位器和乘法器,对寄存器完成高速数据处理操作。
3) 4种类型的分支指令,用于控制程序执行流程、指令优先级、ARM代码和Thumb代码的切换
4) 3种类型的协处理器指令,专用于控制外部协处理器。
1. 条件码
<opcode>{<cond>} {S} <Rd>,<Rn>{,<operand2>}
使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。
所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。
指令条件吗:
实例:
2. 存储器访问指令
(1)、基本指令:LDR|STR|LDM|STM {<cond>} {B} {T}<Rd>, <addressing_mode>
存储器访问指令分为单寄存器操作指令和多寄存器操作指令。
(2)、ARM存储器访问指令——单寄存器加载
所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令”。
LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,就实现了程序散转。LDR/STR指令是寄存器加载/存储指令,后缀B表示字节操作,后缀H表示半字操作。
LDR和STR指令应用示例:(P55)
1) 加载/存储字和无符号字节指令
LDR R2,[R5] ;将R5指向地址的字数据存入R2
STR R1,[R0,#0x04] ;将R1的数据存储到R0+0x04地址,若有!,则R0就要更新
LDRB R3,[R2],#1 ;将R2指向地址的字节数据存入R3,R2=R2+1
STRB R6,[R7]