本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》。
要想进行ARM的汇编编程,首当其冲要知道最基本、最常用的指令,而要了解指令则必须要了解寻址方式。所以这里将聚焦在——基本寻址方式和基本指令。
首先,来看一看我们已经见过的2条指令:MOV pc, lr和BL addsub
最简单的汇编指令格式是操作码(例如:MOV、BL)和操作数(例如:pc, lr, addsub)。操作码易于理解,例如MOV表示将某个值从一处传送到另一处,BL表示跳转到某处;而操作数则表示一处和另一处到底是哪里(是在寄存器中还是内存中),要跳转的位置在哪里(或者是绝对地址或者是相对地址)。
操作数部分要解决的问题是:到哪里去获得操作数?因此就有了寻址方式的分类。基本上来讲,ARM共有8种寻址方式,这里我们先了解其中最基本的3种寻址方式:寄存器寻址、立即数寻址、寄存器间接寻址。
1.2.1 最常见寻址方式精解
1. 寄存器寻址
MOV pc, lr 表示操作数来源于寄存器(pc和lr)。对于这种寻址方式而言,在指令的32位机器码中的地址码部分,存放的是寄存器(pc和lr)的编号,故称之为寄存器寻址。
2. 立即数寻址
MOV pc, #64 表示将常数64放入寄存器pc,其中常数64被称为立即数。立即数寻址指令中的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(故称为立即数)。
这里,可能大家会看出一个问题:由于立即数是位于32位机器码中的,而32位机器码中除了操作数外还有操作码,这就意味着不可能用全部32bit来表示立即数。事实上,ARM机器指令中,仅用了最低的12bit来表示立即数。那么我们自然推论立即数的范围是-2048——2047,这意味着MOV pc, #8192这样的指令是非法的。但事实情况并非如此,MOV pc,#8192是合法且能正常运行的。真实情况是,ARM机器指令可以表示的立即数范围是-2^31--2^31-1,只不过它只能表示这其中的 2^12个数字而已。ARM是这样用12bit来表