ARM指令的编码格式
实际指令语法格式为:
ADDEQS R0,R1,R2;
该指令的编码格式为:
ARM指令的助记符
ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为:
<opcode>{<cond>} {S} <Rd>,<Rn>,<op2>
其中:
<opcode> 操作码,如ADD表示算术加操作指令;
{<cond>} 决定指令执行的条件域;
{S} 决定指令执行是否影响CPSR寄存器的值;
<Rd> 目的寄存器;
<Rn> 第一个操作数,为寄存器;
<op2> 第二个操作数。
例如,指令 ADDEQS R1,R2,#5
条件域<cond>
几乎所有的ARM指令都可以根据当前程序状态寄存器CPSR中标志位的值,有条件地执行。
ARM指令的条件域<cond>有16种类型。
ARM指令中的第二操作数
灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:
#immed_8r——常数表达式;
Rm——寄存器方式;
Rm,shift——寄存器移位方式
ARM指令中的第二操作数
如果一个32位立即数直接用在32位指令编码中,就有可能完全占据32位指令编码空间。因此,ARM指令的32位立即数是通过循环右移偶数位得到的。
立即数是由一个8位的常数循环右移位偶数位得到的。
<immediate>=immed_8循环右移(2×rotate_imm)
例如:下面的代码段:
MOV R0, #0x0000F200
MOV R1, #0x00110000
MOV R4, #0x00012800
上面的指令经过汇编之后得到的二进制编码为:
8000:E3A00CF2 (0xF200是由0xF2循环右移24位得到的)
8004:E3A01811(0x110000是由0x11循环右移16位得到的)
8008: E3A04B4A(0x12800是由0下4A循环右移24位得到的)
非法的立即数:0x1010,0x00102,0xFF1000