一、ARM指令格式:<opcode> {<cond>} {S} <Rd> ,<Rn>{, <opcode2>}
格式<>:内项目必选。{}:内项目可选。
opcode:指令助记符(ldr str等)。
cond:条件码,描述指令执行条件。
S:可选后缀,带" S "表示指令执行完后,自动更新CPSR中的条件码标志位的值。
Rd:ARM指令中的目标操作数总是一个寄存器,通常用Rd表示。
Rn:存放第1操作数寄存器。
opcode2:第2操作数,可以是寄存器或立即数,且能使用经过位移运算后的寄存器和立即数。
立即数:用高4位 + 低8位表示,rotate + immed_8。立即数 = immed_8 循环右移 (2 * rotate)位。可以用下列方法判断立即数:
ARM Instruction Set Format1、把数据转换成二进制,从低到高写成4位1组的形式,最高位一组不够四位的,在最高位之前补0。
2、数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
3、如果数据中间有连续的大于等于24个0, 循环左移4的倍数,使高位全为0。
4、找到最高位的1,去掉前面最大偶数个0。
5、找到最低位的1,去掉后面最大偶数个0。
6、数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。
二、ARM中的寄存器:ARM共37个寄存器,可工作于7种模式:
各个寄存器未分组寄存器r0-r7所有模式共用,共8个。
分组寄存器中r8-r12,快速中断模式有自己的一组寄存器,其他模式共用,共10个。
分组寄存器r13(sp),r14(lr),除用户模式和系统模式共用外,其他模式各一组,共 2*7 - 2 = 12个。
r15(pc)和CPSR共用,共2个。
SPSR除用户模式和系统模式没有外,其他模式各一个,共5个。总共8+10+12+2+5 = 37个。与此对应的汇编名称表明了它们通常的约定用法。
1、r0-r3:临时寄存器。保存参数,结果或者寄存器的值。用作传入函数参数,传出函数返回值。在子程序调用之间可随意使用。被调函数返回前不必恢复原值。如果调用函数需要再次使用r0-r3的内容,则它必须保留这些内容。
2、r4-r11:变量寄存器。存放函数的局部变量。如果被调函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
3、r9 (sb):静态基址寄存器。
4、r10 (sl):堆栈限制寄存器。
5、r11 (fp):帧指针。
6、r12 (ip):内部程序调用暂存寄存器。可用于保存SP,在函数返回时使用该寄存器出栈。被调函数返回前不必恢复。
7、r13 (sp):数据栈指针寄存器。针对不同模式,共有6个SP。通常指向各模式对应的专用堆栈。退出被调用函数时必须恢复。
8、r14 (lr):子程序连接寄存器。保存执行bl的下一条指令地址(pc)。
9、r15 (pc):程序计数器。存放下一条指令的地址。
10、f0-f7:FPA寄存器。s0-s31:VFP单精度寄存器。d0-d15:VFP双精度寄存器。p0-p15:协处理器0-15。c0-c15:协处理器寄存器0-15。
11、状态寄存器PSR(共用r15)。详见下文!
三、状态寄存器PSR(r15):
CPSR:当前程序状态寄存器。SPSR:保存的程序状态寄存器。状态寄存器的32位可以分为4个8位的域: f: 指示bits[31 : 24],又名条件标志位域。s: 指示bits[23 : 16],又名状态标志位域。x: 指示bits[15 : 8], 又名扩展位域。c: 指示bits[7 : 0],又名控制位。区域名必须为小写字母。
PSR寄存器数据格式1、条件标志位( N,Z,C,V ):可用逻辑、算术、或 MSR 和 LDM 指令操作。处理器会测试这些标志位,以确定是否操作一些指令 (例如:cmp指令会设置Z位,而beq会读取Z位决定操作)。bit31-Bit28是状态位,如下图:
2、控制位( I,F,T,M ):发生异常时, 这些位将产生相应变化。特权模式下可以通过软件去修改这些位。
bit7 bit6 中断禁止位:(I=1, IRQ禁止; F=1, FIQ禁止)
bit5 状态控制位:(T=0: ARM状态。T=1: Thumb状态)
bit4-bit0 模式控制位:( M[4:0],这5位组合控制处理器处于什么工作模式,异常体系中会详细讲解)
四、PSR 的操作:
1、状态寄存器访问指令仅有两条:MRS(状态寄存器 ==> 通用寄存器的传送指令) 和 MSR(立即数/通用寄存器 ==> 状态寄存器的传送指令)。
①、mrs {<condition>} rd, cpsr
condition可缺省,为执行条件码。
②、msr {<condition>} cpsr_<fields>, #immediate
fields用来设置状态寄存器中需要操作的位 (f/s/x/c),mrs cpsr_x, r1:表示仅修改cpsr的扩展位。
immediate是作为参数的立即数。
网友评论