要做程式的優化,最徹底的方法當然是彙編!還有除了彙編以外(除了二進位制)能讓你對你的處理器有更全面的控制嗎?!對於arm彙編,作為乙個初學者,也就只好先補補基礎了@_@。
首先,程式段的定義從area 開始,它命名乙個**區域,注意,用非阿拉伯數字作為名字時,應該用|把名字包起來,code關鍵字宣告程式(猜測),readonly宣告訪問許可權(猜測)。export 來表示某個可以用作外部連線的符號(簡單點,應該就是函式名?)。end用來結尾。
#eg:
area |.text|, code, readonly
export square
; int square(int i)
square ;armcc把不縮排的正文作為乙個標號定義
mul r1,r0,r0
mov r0,r1 ;arm乘法指令有乙個限制,就是目標暫存器不能和第乙個引數暫存器相同
mov pc,lr ;對thumb指令,應該改為bx lr
end使用import,可以宣告其他檔案中定義的標號,要用arm c庫的話,就import |lib$request$armlib|, weak表示本行的標號如果找不到,不會報告連線錯誤。如果程式包含主程式main,那麼要引入標號__main,代表c庫初始化的開始。rn可以讓使用者給暫存器命名。
#eg:
area |.text|, code,readonly
export main
import |lib$$request$$armlib|, weak
import __main ;c library entry
import printf ;prints to stdout
i rn 4
;int main(void)
main
stmfd sp!,
mov i,#0
loop
adr r0,print_string
mov r1,i
mul r2,i,i
bl printf
add i,i,#1
cmp i,#10
blt loop
ldmfd sp!,
print_string
dcb " square of %d is %d/n", 0
endmap(別名^)和field(別名#),可以在堆疊中為變數和陣列定義和分配空間。
map 0
;map symbols to offsets starting at offset 0?
a field 4 ;a is 4 bytes integer(at offset 0)
b field 2 ;b is bytes integer(at offset 4)
c field 64 ;c is an array of 64 characters (at offset 6)
length field 0
;length records the current offset reached?
macro用來宣告巨集:
macro
checksum $ alignment
checksum_$ alignment
ldr w,[data],#4
l0 ;loop
if $ alignment<>0
add sum,sum,w,lsr #8, $alignement
ldr w,[data],#4
subs n,n,#1
add sum,sum,w,lsl#32-8* $ alignment
else
add sum,sum,w
ldr w,[data],#4
subs n,n,#1
endif
bgt %bt l0
mov pc,lr
mend
針對彙編的優化主要是面向硬體的。首先是流水線,有些load指令要需要多個週期來完成,可以通過調整指令的順序(當然要保證邏輯)來改善效能。另外,盡量讓程式只是用暫存器,方法是搞清楚資料占用暫存器的時間關係,實現暫存器有效的分時復用。另外,可以將長度較小的變數合併到乙個32位暫存器中儲存,以節省暫存器。由於pc可以通過程式操作,對於條件指令,可以直接用pc與形成分支的引數作運算來尋找對應的分支:
;int switch_relative(int x)
switch_relative
cmp x,#8
addlt pc,pc,x,lsl,#2
b method_d ;利用流水線,如果pc還是按順序那麼default分支的預取址就不
;會被沖掉
b method_0
b method_1
ARM彙編優化技巧
1.加減法,邏輯操作佔乙個週期,目的位址是pc暫存器時增加乙個週期。分支指令佔3個週期。在cache命中的情況下,16位和8位的裝載指令 ldrh ldrh等 佔乙個週期,但緊跟的2個週期不能使用裝入的資料。32位裝載指令佔乙個週期,緊跟的乙個週期不能使用裝載資料。如果裝載入pc,同樣要增加2個週期...
ARM上的彙編優化小方法
1.加減法,邏輯操作佔乙個週期,目的位址是pc暫存器時增加乙個週期。分支指令佔3個週期。在cache命中的情況下,16位和8位的裝載指令 ldrh ldrh等 佔乙個週期,但緊跟的2個週期不能使用裝入的資料。32位裝載指令佔乙個週期,緊跟的乙個週期不能使用裝載資料。如果裝載入pc,同樣要增加2個週期...
ARM彙編和內嵌彙編
彙編指令 跳轉指令 b bl blxbx 資料處理指令 mov mvnadd adcsub rsbrsc andor eorbic cmncmp tstteq 狀態暫存器指令 mrs msrldr strldm stmmcr arm和協處理器之間資料交換 mrccond 可選的條件 rd 存放返回狀...