(1)数据处理指令的编码格式
cond: 指令的条件码
I: 用于区别operand2是立即数(I=1)还是寄存器(I=0)
opcode:指令操作码
S: 操作是否影响cpsr,S=0不影响,S=1影响
Rn: 包含第一个操作数的寄存器编码
Rd: 目标寄存器编码
operand2:第二操作数,有三种方式:立即数方式,寄存器方式,寄存器移位方式。每种方式下的编码格式不一样
立即数方式:
如图所示,在ARM的指令系统中,每个32位的立即数被编码成一个12位的数。这个32位的数是由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制数的两倍表示,如图,8位常数加4位循环右移位数构成了一个12位数。
设立即数为immediate,8位常数便为immed8,4位的循环右移值为rotate,则:
immediate = immed8 循环右移 rotate*2
所以并不是每一个32位的常数都是合法的立即数,只有能通过上面的构造方法得到的才是合法的立即数。但是若当把一个数按位取反后,则得到一个合法的立即数时,这个数为有效数。此时将mov指令换成mvn指令执行
ARM汇编编译器按照下面的规则来生成立即数的编码
- 当立即数在0—0xFF范围时,令immediate = immed8 ,rotate = 0;
- 其他情况下,汇编编译器选择rotate数值最小的编码方式
例:MOV R0,#0xFC0
ADD R0,R1,#0x66
寄存器方式:
Rm:</