ARM彙編優化

2021-09-05 16:39:11 字數 2802 閱讀 6801

要做程式的優化,最徹底的方法當然是彙編!還有除了彙編以外(除了二進位制)能讓你對你的處理器有更全面的控制嗎?!對於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 存放返回狀...