首先,这个是为一个有汇编语言基础的人看的,我在写的过程中希望能有人来为我指点,谢谢帮助我的人。
首先是ARM的指令格式:
所有的ARM指令语句都有这样的格式:
{。。。}{。。。。}{。。。。}
分为三部分,
{symbol} {instruction | directive | pseudo-instruction} {;comment}
这里的,“{}”是指,可选,“|”是指或者。。
每条指令都是以32位二进制数进行编码的。
32位是指ARM本身是32位的处理器。自然指令也设计成32位的,并且也会兼容16位的指令,Thumb集
Thumb集是指除ARM指令集以外,ARM处理器所支持的另一个指令集。它的特点是16位的,代码密度高。
代码密度是指完成同一个功能所需要的代码量大小。
编码是指计算会为每一条汇编指令分别指定一个唯一的二进制序列。32位二进制数组成。
ARM指令的总体分类:六类。
- 数据处理指令
- Load/Store指令
- 跳转指令
- 程序状态寄存器处理指令
- 协处理器指令
- 异常产生指令
ARM指令使用的基本格式:
<opcode>{<cond>}{S} <Rd>, <Rn> {, <operand2>}
<opcode> :是指令码,表示这个指令的作用,
<cond>:是条件位,也就是上文提到的,<cond>它会自动判断CPSR寄存器中的值根据表格进行执行。
{S}:是置位标志,有此标志的指令,在执行后会根据结果,更新CPSR寄存器。
<Rd>:是目标寄存器,存放结果
<Rn>:第1操作数寄存器
{,<operand2>}:第2操作数
第2操作数有可能是一个立即数,也有可能是一个寄存器,这个就是下面我们要讨论的寻址问题。如何找到指令中所指的操作数,是一个大学问,也同时决定了,一个CPU的能力,和水平。也是为程序员所能提供的,操作机器的方式。
ARM的寻址方式
七种寻址方式:
立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址。
1.立即寻址:
顾名思义就是“马上”就使用这个“数”去参与指令操作,因为这个“数”不用找,它就放在指令里面。同指令一起编译、解码、执行。