1. 程式人生 > >ARM體系架構之——彙編指令集

ARM體系架構之——彙編指令集

一、聊聊彙編指令和偽指令的真假
學完微控制器的時候,我們很迷惑,到底什麼是彙編指令,什麼是偽指令?
彙編指令:是CPU提供的指令。機器碼的助記符 我們隨便翻開一本微控制器的教程最後幾頁附錄都有彙編指令和機器碼的對應關係。例如彙編指令 mov r0, #0x0 編譯後是有對應的機器碼的。
偽指令:其實不是真正的指令,它是由編譯器提供的指令。放在指令中用於指導編譯器進行編譯過程,不會生成對應的機器碼。
.globl IRQ_STACK_START 指示告訴編譯器IRQ_STACK_START設定為外部屬性,這樣其他檔案就可以呼叫這個函式。
二、大小寫引發的ARM指令風格的腥風血雨
很多時候我們可以看到兩種不同風格的程式設計LDR R0, [R1]和ldr r0, [r1],到底誰對誰錯呢?其實都是對的,只是風格不一樣罷了!
ARM官方的彙編風格是大寫,比如在ADS、MDK(ARM把當年開發51的keil收購了,現在改名叫MDK,功能更加強大)等開發環境中。
GNU風格是小寫(貝爾實驗室當年搞的),一般是在linux中。
三、說說ARM彙編的特點
1、LDR/STR架構:ARM是RISC架構,設計時是不能直接訪問記憶體的,而只能與暫存器打交道。所以必須將記憶體載入到通用暫存器或者是將暫存器中的內容寫入到記憶體空間中,CPU才能進行處理,那麼LDR和STR這兩兄弟就是幹這個事情的。這個組合實現了CPU與記憶體資料的互動。
2、8中定址方式
暫存器定址: mov r1, r2
立即定址: mov r0, #0xFF00
暫存器移位定址: mov r0, r1, lsl #3 (r0 = r1<<3)
暫存器間接定址 ldr r1, [r2] 將記憶體地址裡面的內容給r1
可以這麼理解:r2類似與指標,指向的是記憶體地址, [r2]表示:該指標指向的地址單元內容。
基址變址定址 ldr r1, [r2, #4] 記憶體地址是r2+4
多暫存器定址 ldmia r1!, {r2-r7, r12}
將[r1]—r2 [r1+4]—r3…..
堆疊定址 stmfd sp!, {r2-r7, lr} 壓棧
相對定址 beq flag flag:
3、指令字尾:
B 操作長度是8
H操作長度是16
S 影響CPSR
4、條件字尾
例如:moveq r0, r1 類似於:if eq {r0, r1} eq的成立取決於上面的程式碼
5、ARM的多級指令流水線
PC指向的是正在被取指的指令而不是正在執行的指令
PC 取址
PC-4 解碼
PC-8 執行
四、總結:
彙編指令說簡單也簡單,說難也難。我們大部分時間是採用C語言和C++進行程式的設計,所以彙編的運用一般是中斷和核心。這個在我們以後討論這些問題時再詳細研究!