ARM彙編基礎指令

Cortex-A7 常用彙編指令

一、處理器內部數據傳輸指令

1.mov

將數據從一個暫存器拷貝到另外一個暫存器,或者將一個立即數傳遞到暫存器裡面

MOV R0,R1 @將暫存器 R1 中的數據傳遞給 R0,即 R0=R1
MOV R0, #0X12 @將立即數 0X12 傳遞給 R0 暫存器,即 R0=0X12

2.MRS

將特殊暫存器(如 CPSR 和 SPSR)中的數據傳遞給通用暫存器,要讀取特殊暫存器的數據只能使用 MRS 指令

MRS R0, CPSR @將特殊暫存器 CPSR 裡面的數據傳遞給 R0,即 R0=CPSR

3.MSR

MSR 指令和 MRS 剛好相反,MSR指令用來將普通暫存器的數據傳遞給特殊暫存器,也就是寫特殊暫存器,寫特殊暫存器只能使用 MSR

MSR CPSR, R0 @將 R0 中的數據複製到 CPSR 中,即 CPSR=R0

二、存儲器訪問指令

1.LDR

直接讀取CPU的暫存器的值

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

2.STR

將數據寫入到存儲器中

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

三、壓棧與出棧指令

還記得學單片機的時候中斷操作嗎?當你中斷的時候你當前執行程式的指令程式碼地址,會被壓倒棧中暫時存儲起來,當你執行完中斷操作,回到主程式是,就需要把存儲在棧中的指令地址重新取出來。

1.PUSh

初始SP指針指向0X80000000

PUSH {R0~R3, R12} @將 R0~R3 和 R12 壓棧

執行完以上操作後,SP指向了0X7FFFFFEC

再次進行壓棧,對LR

PUSH {LR} @將 LR 進行壓棧

2.POP

出棧操作,後進去的先出來,也就是從棧頂開始出來

POP {LR} @先恢復 LR 
POP {R0~R3,R12} @在恢復 R0~R3,R12

3.對於壓棧、出棧還有這樣的寫法

STMFD SP!,{R0~R3, R12} @R0~R3,R12 入棧
STMFD SP!,{LR} @LR 入棧 34 

LDMFD SP!, {LR} @先恢復 LR
LDMFD SP!, {R0~R3, R12} @再恢復 R0~R3, R12

是不是感覺有點熟悉,這裡的STM 和 LDM就是前面說的LDR 和 STR,只不過不是一個量級的存儲和讀取操作,STM 和 LDM 就是多存儲和多
載入,可以連續的讀寫存儲器中的多個連續數據。

四、跳轉指令

1.B

直接跳轉到目標地址

1 _start: 
2
3 ldr sp,=0X80200000 @設置棧指針
4 b main @跳轉到 main 函數

使用B指令,直接跳轉到C文件的main函數中,但注意,跳過去你就會不來了!!
如果你想回來怎麼辦?那就要用到下面這個指令了。

2.BL

BL 指令相比 B 指令,在跳轉之前會在暫存器 LR(R14)中保存當前 PC 暫存器值,所以可以通過將 LR暫存器中的值重新載入到PC中來繼續從跳轉之前的程式碼處運行,這是子程式調用一個基本但常用的手段。

1 push {r0, r1} @保存 r0,r1
2 cps #0x13 @進入 SVC 模式,允許其他中斷再次進去
3
4
5 bl system_irqhandler @載入 C 語言中斷處理函數到 r2 暫存器中
6
7 cps #0x12 @進入 IRQ 模式
8 pop {r0, r1} 
9 str r0, [r1, #0X10] @中斷執行完成,寫 EOIR

在第5行的時候上面這個程式就中斷去執行了別的函數,但之後,還會回來繼續之鄉下面的程式。

五、算術運算指令

六、邏輯運算符

Tags: