歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

ARM匯編指令總結

/** ****************************************************************************** * @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

Copyright © Linux教程網 All Rights Reserved