匯編指令及其特點
基礎知識
指令與偽指令
匯編指令: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。
匯編指令及其特點