1. 程式人生 > >匯編指令及其特點

匯編指令及其特點

間接尋址 地址 block 指針 常用 編譯過程 標誌位 準備工作 環境

基礎知識

指令與偽指令

匯編指令:CPU機器指令的助記符,編譯後得到1和0組成的機器碼,由CPU讀取執行

偽指令:本質上不是指令,由編譯環境提供,謎底在於知道編譯過程,最終不會生成機器碼

不同的ARM風格

ARM官方匯編風格:指令一般大寫,windows IDE開發環境常用。(譬如:LDR、STR)

GNU風格的ARM匯編:指令一般小寫,linux中常用。(譬如:ldr、str)

ARM匯編的特點

ARM匯編特點1:LDR和STR架構

ARM采用RISC架構,CPU不能直接讀取內存,需要將內存內容加載到CPU通用寄存器才能被CPU處理。

ldr(load register):將內存內容加載到通用寄存器    

str(store register):將指令存取通用寄存器

用ldr和str組合就能很好實現數據交換

ARM匯編特點2:八種尋址方式

寄存器尋址 mov r1, r2             //把r2存入r1
立即尋址 mov r0, #0xFF00           //把後面的數字存入r0
寄存器移位尋址 mov r0, r1, lsl #3      //把r1左移3位後存入r1
寄存器間接尋址 ldr r1, [r2]        //把r2這個內存地址所對應的值賦值給r1
基址變址尋址 ldr r1, [r2, #4]       //把r2+4後的內存地址多對應的值存入r1
多寄存器尋址 ldmia r1!, {r2-r7, r12}   //
把r1到r7以及r12依次存在r1,r2,r3,r4,r5,r6,r7,r8 堆棧尋址 stmfd sp!, {r2-r7, lr}     //把堆棧SP中的內容依次存在r2,r3,r4,r5,r6,r7,lr中 相對尋址   beq flag          //跳轉到標號flag      flag:     

ARM匯編特點3:指令後綴

同一指令經常附帶不同後綴,變成不同的指令。

經常使用的後綴有:

B(byte)功能不變,操作長度變為8位

H(half word)功能不變,長度變為16位      //由於我們在32位系統中,依次操作32位的效率是最高的,所以一般用ldr

S(signed)功能不變,操作數變為有符號 如 ldr ldrb ldrh ldrsb ldrsh   

S(S標誌)功能不變,影響CPSR標誌位 如 mov和movs movs r0, #0

ARM匯編特點4:條件執行後綴

無後綴:mov r0, r1

有後綴:moveq r0, r1    //如果eq後綴成立則執行mov r0, r1,如果不成立則本句代碼作廢

註意:(1)條件執行後綴是否成立,不是取決於本句代碼,而是取決於之前代碼執行的結果

   (2)條件後綴決定了本句代碼是否執行,而不會影響上一句和下一句代碼是否被執行

技術分享

常用的一般就是EQ(equal)、NE(not equal)、GT(great than)、LT(less than)

ARM匯編特點5:多級指令流水線

技術分享

為了讓CPU處理起來更加的具有效率,CPU往往是一邊執行指令的同時就在提前讀取下面的指令了,對於三級流水線,以ARM為例子,在32位系統中,一條指令剛好4個字節。

舉例分析:假設有三條指令地址為:0xd002_0040、0xd002_0044、0xd002_0048

當前已經執行到0xd002_0040,為了保證運行流暢高效,實際上CPU指令指針PC已經指向0xd002_0048了,開始做準備工作了。所以對應的,他們的地址分別為:PC-8和PC。

匯編指令及其特點