/**
******************************************************************************
* @author Maoxiao Hu
* @version V1.0.1
* @date Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
ARM的指令集去哪裡查才最權威最詳細呢?
一般ARM官方網站上會有針對你手上芯片對應指令集的《架構參考手冊》,ARMv7架構參考手冊.pdf下載地址 http://www.linuxidc.com/Linux/2016-03/129589.htm,可以免費下載。例如我手上的exynos4412是ARM v7-A指令集,那麼對應的手冊就是《
arm_architecture_reference_manual ARMv7-A and ARMv7-R edition.pdf》。
到Linux公社1號FTP服務器下載
------------------------------------------分割線------------------------------------------
FTP地址:ftp://ftp1.linuxidc.com
用戶名:ftp1.linuxidc.com
密碼:www.linuxidc.com
在 2016年LinuxIDC.com\3月\ARM匯編指令總結\
下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm
------------------------------------------分割線------------------------------------------
在這個手冊的第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