linux開發中常用ARM彙編總結

一、彙編語句的格式

label:instruction @ comment
label 即標號,表示地址位置,有些指令前面可能會有標號,這樣就可以通過這個標號得到指令的地址,標號也可以用來表示數據地址。注意 label 後面的冒號“:”,任何以冒號“:”結尾的標識符都會被認識是一個標號。
instruction 即指令,也就是彙編指令或僞指令。
@符號,表示後面的是註釋,就跟 C 語言裏面的“/”和“/”一樣,其實在 GNU 彙編文件中我們也可以使用“/”和“/”來註釋。
comment 就是註釋內容。
例:
add:MOVS R0, #0X12 @設置 R0=0X12
上面代碼中“add:”就是標號,“MOVS R0,#0X12”就是指令,最後的“@設置 R0=0X12”就是註釋。

二、常用的彙編指令

處理器內部數據傳輸指令(處理器內部R0-R15,CPSR等寄存器)

1 、MOV 指令
MOV 指令用於將數據從一個寄存器拷貝到另外一個寄存器,或者將一個立即數傳遞到寄存器裏面,使用示例如下:
MOV R0,R1 @將寄存器 R1 中的數據傳遞給 R0,即 R0=R1
MOV R0, #0X12 @將立即數 0X12 傳遞給 R0 寄存器,即 R0=0X12

2 、MRS 指令
MRS 指令用於將特殊寄存器(如 CPSR 和 SPSR)中的數據傳遞給通用寄存器,要讀取特殊寄存器的數據只能使用 MRS 指令!
使用示例 如下:
MRS R0, CPSR @將特殊寄存器 CPSR 裏面的數據傳遞給 R0,即 R0=CPSR

3 、MSR 指令
MSR 指令和 MRS 剛好相反,MSR 指令用來將普通寄存器的數據傳遞給特殊寄存器,也就是寫特殊寄存器,寫特殊寄存器只能使用 MSR,使用示例如下:
MSR CPSR, R0 @將 R0 中的數據複製到 CPSR 中,即 CPSR=R0

存儲器訪問指令(用於訪問外設寄存器)
(重要!!!) ARM 不能直接訪問存儲器,比如 RAM 中的數據。I.MX6UL 中的寄存器就是 RAM 類型的。

1 、LDR 指令
LDR 主要用於從存儲加載數據到寄存器 Rx 中,LDR 也可以將一個立即數加載到寄存器 Rx中,LDR 加載立即數的時候要使用“=”,而不是“#”。在嵌入式開發中,LDR 最常用的就是讀取 CPU 的寄存器值,比如 I.MX6UL 有個寄存器 GPIO1_GDIR,其地址爲 0X0209C004,我們現在要讀取這個寄存器中的數據,示例代碼如下:
示例代碼:

LDR R0, =0X0209C004 @將寄存器地址 0X0209C004 加載到 R0 中,即 R0=0X0209C004
LDR R1, [R0] @讀取地址 0X0209C004 中的數據到 R1 寄存器中

上述代碼就是讀取寄存器 GPIO1_GDIR 中的值,讀取到的寄存器值保存在 R1 寄存器中,上面代碼中 offset 是 0,也就是沒有用到 offset。

2 、STR 指令
LDR 是從存儲器讀取數據,STR 就是將數據寫入到存儲器中,同樣以 I.MX6UL 寄存器GPIO1_GDIR 爲例,現在我們要配置寄存器 GPIO1_GDIR 的值爲 0X2000002,示例代碼如下:

LDR R0, =0X0209C004 @將寄存器地址 0X0209C004 加載到 R0 中,即 R0=0X0209C004
LDR R1, =0X20000002 @R1 保存要寫入到寄存器的值,即 R1=0X20000002
STR R1, [R0] @將 R1 中的值寫入到 R0 中所保存的地址中

LDR 和 STR 都是按照字進行讀取和寫入的,也就是操作的 32 位數據,如果要按照字節、半字進行操作的話可以在指令“LDR”後面加上 B 或 H,比如按字節操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。

3、壓棧和出棧指令(進行現場保護的時候需要進行壓棧(入棧)操作,恢復現場就要進行出棧操作,遵從先進先出原則)

PUSH <reg list>  將寄存器列表存入棧中。
POP <reg list>  從棧中恢復寄存器列表。

在這裏插入圖片描述
注:SP 指針指向 0X80000000,處理器的堆棧是向下增長的,即從高地址壓棧向低地址(SP指針向下變動),出棧則從低地址箱高地址出棧
4、跳轉指令
①、直接使用跳轉指令 B、BL、BX 等。
②、直接向 PC 寄存器裏面寫入數據
在這裏插入圖片描述
5、算術運算指令
在這裏插入圖片描述
6、 邏輯運算指令
在這裏插入圖片描述

以後遇到一些彙編指令再更新!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章