1、编码格式:
2、语法格式:
3、解释:
3.4、arm指令的16个条件码,如下:
3.5、⽰例代码说明使⽤条件码以实现⾼效的逻辑操作:
C代码:
if(a> b)
a++;
指令格式:
LDR指令的编码格式如下:
LDR指令的语法格式如下:
3.5、根据寻址⽅式的地址计算⽅法和地址偏移量可知第⼆个操作数的内存地址共有如下9种格式:
以第⼀种格式为例说明第⼆个操作数的内存地址的计算⽅法:
[, #+/- ]表⽰基址寄存器Rn值加或减偏移量,它的指令编码为:
4.1、指令的语法格式如下:
4.2、指令中内存单元的寻址⽅式有以下6种:
4.2、以第三种寻址⽅式说明内存地址的计算⽅法
offset指令是什么意思使⽤该寻址⽅式[, #+/-]! 的指令编码格式如下:
使⽤事先更新⽅法计算内存地址,它的伪代码如下:
5.2、它的语法格式和指令编码格式如下:
P位表⽰基址寄存器Rn所指的内存单元是否包含在指令使⽤的内存块中。
5.3、address_mode表⽰地址变化⽅式,有四种,如下所⽰:
DA指令编码格式如下:
内存地址的算法,伪代码表⽰如下:
6.2、指令的语法格式和编码格式如下:对各个标志位含义的解释:
#immed_8r:
该常数必须对应8位位图(即⾸尾两个"1"bit间的间距为6bits且该常数通过循环左移偶数位所有bit=1的位必集中在低8bits)。如
0x1FE、511、0xFFFF、0x1010、0xF0000010为⾮法常量,0x3FC、0、0xF0000000、200、 0xF0000001为合法常量。
利⽤这种转换巧妙的实现了:在32bits的ARM指令代码中集成32bits的⽴即数(常数)。如⽴即寻址的 数据处理指令的指令代码为:xxxx001a aaaSnnnn ddddrrrr bbbbbbbb,则其第⼆个操作数op2=#b,ROR #2r,由op2到指令码的转换经编译器完成。
对其中的operand2的常数表达式有这样的规定:“该常数必须对应8位位图,即常熟是由⼀个8位的常熟循环右移偶数位得到的。”这句话的意思是说,当⽤12位第⼆操作数来表⽰⼀个32位⽴即数时,采⽤的
是将8位数通过移位的⽅式来实现的,其中12位第⼆操作数的低⼋位存放被移位的“基本”数(取值范围为0到255),⽽⾼四位存放的是循环右移的位数,因为位四位⼆进制数,所以取值范围位为0到15,⽽对应的移位位数则为0到30位,也就是说若“移位”数为0,则表⽰“基本”数不变,若“移位”数位1,则表⽰将“基本”数在32位数字空间中循环右移2位,若“移位”数位5,则表⽰将“基本”数在32位数字空间中循环右移10位,若“移位”数位10,则表⽰将“基本”数在32位数字空间中循环右移20位,依次类推。举例表⽰:
AND R1,R2,#0xff
当处理器处理这条指令的第⼆操作数0xff时,因为0xff为8位⼆进制数,所以处理器就将其直接放进8位“基本”数中,⽽4位“移
位”数则为0.
AND R1,R2,#0x104
当处理器处理这条指令的第⼆操作数0x104时,因为此时0x104已经超过了8位⼆进制数,所以处理器就要将其“改造”⼀下,我们先把0x104转换成⼆进制0000 0000 0000 0000 0000 0001 0000 0100,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 0100 0001通过循环右移30位得到的,因此改造后的结果是8位“基本”数中存放0100 0001,⽽“移位”数为15。
AND R1,R2,#0xff000000
当处理器处理这条指令的第⼆操作数0xff000000时,处理器同样要对其“改造”,我们先把0xff000000转换成⼆进制1111 1111 0000 0000 0000 0000 0000 0000,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 1111 1111通过循环右移8位得到的,因此改造后的结果是8位“基本”数中存放1111 1111,⽽“移位”数为4。
我想,通过以上的三个例⼦,就应该明⽩了8位位图的原理了。但是,有些数并不符合8位位图的原理,这样的数在进⾏程序编译时,系统将会提⽰出错,下⾯再举⼏个违反8位位图的例⼦:⽐如0x101,转换成⼆进制后位0000 0000 0000 0000 0000 0001 0000 0001,像这个数,⽆论向右循环⼏位,都⽆法将两个1同时放到低8位中,因此不符合8位位图;再⽐如0x102,转换成⼆进制后位0000 0000 0000 0000 0000 0001 0000 0010,如果将两个1同时放到低8位中,即转换成⼆进制后为0000 0000 0000 0000 0000 0000 1000 0001,需要将此⼆进制数向右移31位,这也不符合循环右移偶数位的条件,因此0x012也不符合8位位图;再举⼀个
0xff1,转换成⼆进制后将会有9个1,不可能将其同时放⼊8位中,因此当然也不符合啦。
通过正反例的⽐较,可以总结如下:第⼀,判断⼀个数是否符合8位位图的原则,⾸先看这个数转换成⼆进制后1的个数是否不超过8个,如果不超过8个,再看这n个1(n<=8)是否能同时放到8个⼆进制位
中,如果可以放进去,再看这⼋个⼆进制位是否可以循环右移偶数位得到起初被判断的那个数值,如果可以,则此数值即为符合8位位图原理,否则,不符合。第⼆,⽤12位的编码来表⽰⼀个任意的32位数是不可能的,只能通过循环右移⼋位⼆进制数偶数位来得到⼀部分32位数,其余的⽆法表⽰的32位数,只有通过其它途径获得了,⽐如0xffffff00,可以通过0x000000ff按位取反得到,因此在以后的编程中,⼀定要注意⽤到的第⼆操作数是否符合8位位图。
Rm:
在寄存器⽅式下,第⼆个操作数即寄存器的数值;
Rm,shift:
在寄存器移位操作⽅式下,将寄存器的移位结果作为操作数,但Rm的值保持不变,移位⽅法有下: