/**
******************************************************************************
* @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是把逗號后面地址指向的值,放到逗號前面的寄存器里去。

舉例:




--------------
str
str的作用是把逗號前面寄存器的值,放到逗號后面指示的地址里去。

舉例:

