文章目录
ARM嵌入式开发中经常会涉及到汇编指令的知识,这里就总结一下最常用的几种ARM汇编指令。
零.预备知识
这里我们主要学习ARM的汇编指令,这些预备知识只是作为一个了解。
1.ARM与X86
要了解ARM,最好的是使用对比的方法。
ARM是一款32位的低功耗RSIC(精简指令集)微处理器。我们常了解的CPU可能就是办公中常用到的X86架构的计算机,X86使用的就是CSIC(复杂指令集),比如很有名的Intel处理器,下面就通过分析一下ARM架构与X86架构的区别来认识ARM:
项目 | ARM | X86 |
---|---|---|
指令集 | RSIC精简指令集 | CSIC复杂指令集 |
功耗 | 低功耗 | 超高性能 |
用途 | 移动端的老大 | PC端的老大 |
解码 | 并行 | 并行 |
ARM的特点是:
- 体积小、低功耗、高性能
- 支持Thumb(16位)和ARM(32位)双指令
- 指令执行效率高
- 寻址方式简单
- 指令长度固定
2.ARM中指令的执行
由于ARM采用RSIC架构,所以CPU本身不能直对内存进行操作,而是先将内存中数据加载到CPU中的寄存器,然后对寄存器中的值进行处理。
ARM中指令的执行遵循流水线形式,众所周知,CPU执行指令都是从内存中进行取指令、分析指令、执行指令的。一阶段持从内存中取回的指令,第二阶段开始解码,而第三阶段实际执行它。故此,程序计数器总是超出当前执行的指令两个指令。
ARM处理指令时,比如要连续执行三条指令:a、b、c,那么ARM在执行a指令的同时,已经在解析b指令了,同时有在内存中取c指令。所以pc寄存器中的地址一般是当前指令地址+8(Byte),因为ARM是32位CPU,所以一次处理的指令是4字节,所以第三条指令的地址就是当前指令的地址+8。
在大概说一下RSIC吧,RSIC将ARM要执行的操作以最基本的指令实现。换句话说,如果人们是在RSIC指令集下执行跑步时,大脑(CPU)对人体发出的指令就是:先迈左脚、再迈右脚、再迈左脚、再迈右脚…将跑步这条指令细化为每一个最基本的操作。如果是CSIC(复杂指令集时),大脑只需要对人体发出指令:跑步,就可以了。
3.ARM的九种寻址方式
寻址方式就是CPU根据指令中的地址信息,找出物理地址也就是内存地址的方式,通俗理解就是ARM指出内存地址的方式。
寻址的目的就是找出操作数,比如ARM要做一个除法运算,就需要除数和被除数,除数和被除数都是除法指令的操作数,要找到这些操作数,可以有多种方法,寻找操作数的过程就叫做寻址。(我个人理解)
ARM支持九种寻址方式:
- 立即数寻址
- 寄存器寻址
- 寄存器偏移寻址
- 寄存器间接寻址
- 寄存器基址变址寻址
- 多寄存器寻址
- 相对寻址
- 堆栈寻址
- 块拷贝寻址
立即数寻址
立即数寻址就是直接将内存中的数据发给CPU作为操作数。注意,由于ARM是32位指令集,所以立即数的范围不可以超出0255,也就是说立即数的范围只能是0255。
格式:就是在立即数前面加上 # 来作为操作数
典型的例子就是直接对寄存器进行写值:
ldr r0, #254 ;将254写入r0寄存器
add r1, r2, #3 ;将r2寄存器中的值与3相加后,在写入r1寄存器
寄存器寻址
寄存器寻址就是直接将寄存器中的数值作为操作数:
ldr r1, r0 ;将r0寄存器中的值写到r0
add r3, r2, r1 ;将r1、r2寄存器的值相加,结果写入r3寄存器
寄存器间接寻址
还是利用了寄存器,只不过操作数不是寄存器中的值了,操作数在内存中,那怎么办?没事,操作数的地址就在寄存器中。所以寄存器间接寻址相当于以寄存器中的值作为内存地址,去内存中寻找操作数。
格式:在提供操作数地址的寄存器上加上[],比如[r0]