ARM 可以用两套指令集:ARM指令集和Thumb指令集,其中ARM指令集是32bit,Thumb指令集是16bit。这里主要关注ARM指令集。
ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为:
{} {S} ,, (<>表示必须有,{}表示可有可无)
其中:
操作码,如ADD表示算术加操作指令;
{} 决定指令执行的条件域;
{S} 决定指令执行是否影响CPSR寄存器的值;
目的寄存器;
第一个操作数,为寄存器;
第二个操作数。
例如,指令 ADDEQS R1,R2,#5
该指令的编码格式为:
条件域
几乎所有的ARM指令都可以根据当前程序状态寄存器CPSR中标志位的值,有条件地执行。
ARM指令的条件域有16种类型。
CPSR寄存器的相关资料见
http://www.cnblogs.com/armlinux/archive/2011/03/23/2396833.html
指令主要有操作码和操作数,操作码直接在指令中,而操作数通常需要寻址获得。寻址分两种:指令寻址和数据寻址,寻找下一条将要执行的指令地址称为指令寻址,寻找操作数的地址称为数据寻址。指令寻址可以细分为顺序寻找和跳跃寻址:
指令寻址:
1、 顺序寻址可以通过程序计数器加1(这里的加一其实指的是一个机器字长,并非是真的加一个字节),自动形成下一条指令的地址;
2、 跳跃寻址则需通过程序转移类指令实现。跳跃的形式有三种:直接,相对和间接寻址
数据寻址:
1、 立即寻址:直接给出操作数
2、 寄存器寻址:速度快,指令长度短
3、 直接寻址:直接给出操作数的地址
4、 间接寻址:多级寻址时,所访问主存单元的最高位为1,说明里面存的还是下一级的地址,直到访问到最高位为0时,才是真正的操作数
5、 寄存器间接寻址:使用寄存器保存操作数在内存中的地址,访问次数少,指令短
6、 变址寻址:将变址寄存器Rx的内容与指令中给出的形式地址A相加,形成操作数有效地址。比如形式地址A是某内存块的起始地址,则无需改动指令,只需要改变Rx中存放的变址值,就可以访问A之后的内存地址。
7、 基址寻址:与变址寻址相反,寄存器中的内容是基址值,与指令中给出的位移量相加形成操作数地址。变址寻址是面向用户,用于访问字符串、向量和数组等成批数据;而基址寻址面向系统,主要用于逻辑地址和物理地址的变换。
8、 相对寻址:是基址寻址的一种变通,由程序计数器(PC)来提供基准地址,指令中的地址码作为位移量。位移量指出的是操作数和现行指令之间的相对位置。也就是说操作数的地址与指令地址之间总是相差一个固定值,操作数与指令在可用的存储区内一起移动,是与位置无关的代码。因为数据是相对指令的位置,而指令时相对第一条指令的位置,那么第一条指令加载在哪里,下面的指令和数据用相对位置就能够正确获得。
9、 页面寻址:这个是属于页式存储管理方法
指令类型:
1、 数据传送类
2、 运算类
3、 程序控制类
4、 输入输出类