arm彙編指令總結(不斷更新)

/**
******************************************************************************
* @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頁之多,用到時詳查便可。
下面說一下查閱文檔須要注意的幾個地方。

1、指令格式

當咱們查找一些指令好比ldrle movne,發現沒法在手冊中搜索到,其實並非沒有這些指令,而是這些指令是在原始指令ldr mov後面加上了條件碼(Condition Code)le ne,而後被寫到了一塊兒。
舉個例子:
LDR的第一種指令格式以下,LDR後面的<c>就表示能夠選擇後接條件碼,固然也能夠不接。
 
NewImage
 
條件碼以下,若是不附加條件碼,就表明AL,無條件執行:
NewImage
 
這樣一來,一個簡單的ldr就能夠派生出ldreq ldrne ldrcs ldrcc……各類指令,其它簡單指令也類同。
知道了這點,99%的指令就均可以讀得懂了,還有極小一部分特殊指令在這裏暫且不說。
 
 
2、經常使用指令
列一下uboot中常常出現的一些指令,做爲練習,按字母順序依次列出。
並且日常所說的什麼位置無關碼,其實不用死記,能夠直接用指令格式進行解釋。
----------
b
NewImage
舉例:
NewImage
第一行 b 7de016d0的彙編碼是ea000002,與上表對照後發現imm24爲2,也就是說目的地址爲當前PC+4+2*4 = 7de016d0
即彙編碼裏只存儲了偏移地址,因此b是位置無關碼,至於b的跳轉範圍,很明顯就是24位有符號數能表示的範圍。
-----------
bl
NewImage
只不過bl會把當前地址+4放到LR寄存器中以備程序返回。
------------
bx
bx指令跳轉到指令中所指定的目標地址。通常這條指令用於程序返回,好比:bx lr
NewImage
舉例:
 
------------
blx
blx將跳轉到Rm寄存器指向的地址,並將當前PC值保存到LR。低四位表明Rx的寄存器號。
NewImage
舉例:
NewImage
既然跳轉到r4指向的寄存器,那麼低四位就是4,高28位通常固定爲e12fff3。
-------------
ldr
ldr是把逗號後面地址指向的值,放到逗號前面的寄存器裏去。
NewImage
舉例:
NewImage  r1 + 4 -> r5
NewImage r3 -> r2
NewImage r3 - 36 -> r2
NewImage pc + 292 -> r0
--------------
str
str的做用是把逗號前面寄存器的值,放到逗號後面指示的地址裏去。
NewImage
舉例:
NewImage r3 -> sp + 28
NewImage r3 -> r2 + r1<<5
相關文章
相關標籤/搜索