/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.1
* @date Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
本文会不时完善和纠正一些小错误,还请到 http://www.cnblogs.com/humaoxiao 参考最新版本。
ARM的指令集去哪里查才最权威最详细呢?
一般ARM官方网站上会有针对你手上芯片对应指令集的《架构参考手册》,可以免费下载。例如我手上的exynos4412是ARM v7-A指令集,那么对应的手册就是《arm_architecture_reference_manual ARMv7-A and ARMv7-R edition.pdf》。
在这个手册的第A8节:Instruction Details 按照字母顺序详细介绍了ARMv7-A的各种指令语法,700页之多,用到时详查即可。
下面说一下查阅文档需要注意的几个地方。
一、指令格式
当我们查找一些指令比如ldrle movne,发现无法在手册中搜索到,其实并不是没有这些指令,而是这些指令是在原始指令ldr mov后面加上了条件码(Condition Code)le ne,然后被写到了一起。
举个例子:
LDR的第一种指令格式如下,LDR后面的<c>就表示可以选择后接条件码,当然也可以不接。
条件码如下,如果不附加条件码,就代表AL,无条件执行:
这样一来,一个简单的ldr就可以派生出ldreq ldrne ldrcs ldrcc……各种指令,其它简单指令也类同。
知道了这点,99%的指令就都可以读得懂了,还有极小一部分特殊指令在这里暂且不说。
二、常用指令
列一下uboot中经常出现的一些指令,作为练习,按字母顺序依次列出。
而且平常所说的什么位置无关码,其实不用死记,可以直接用指令格式进行解释。
----------
b
举例:
第一行 b 7de016d0的汇编码是ea000002,与上表对照后发现imm24为2,也就是说目的地址为当前PC+4+2*4 = 7de016d0
即汇编码里只存储了偏移地址,所以b是位置无关码,至于b的跳转范围,很明显就是24位有符号数能表示的范围。
-----------
bl
只不过bl会把当前地址+4放到LR寄存器中以备程序返回。
------------
bx
bx指令跳转到指令中所指定的目标地址。一般这条指令用于程序返回,比如:bx lr
举例:
------------
blx
blx将跳转到Rm寄存器指向的地址,并将当前PC值保存到LR。低四位代表Rx的寄存器号。
举例:
既然跳转到r4指向的寄存器,那么低四位就是4,高28位一般固定为e12fff3。
-------------
ldr
ldr是把逗号后面地址指向的值,放到逗号前面的寄存器里去。
举例:
r1 + 4 -> r5
r3 -> r2
r3 - 36 -> r2
pc + 292 -> r0
--------------
str
str的作用是把逗号前面寄存器的值,放到逗号后面指示的地址里去。
举例:
r3 -> sp + 28
r3 -> r2 + r1<<5