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行的時候上面這個程序就中斷去執行了別的函數,但之后,還會回來繼續之鄉下面的程序。

五、算術運算指令

六、邏輯運算符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM