ARM 彙編定址方式

2021-09-08 19:37:51 字數 3119 閱讀 8864

arm支援9種定址方式:立即數定址,暫存器定址,暫存器偏移定址,暫存器間接定址,基址變址定址,多暫存器定址,相對定址,堆疊定址,塊拷貝定址。

將資料直接存放的指令中發給cpu,首先由於arm的一條指令佔了32bit,而操作碼本身也要佔據一些位,所以留給立即數的位數肯定不到32bit,其次並不是滿足指定位數的數字都是立即數,arm中的立即數必須可以通過某個8bit的資料經過迴圈右移得到

mov r0,#255     ;r0 <- #255,#0~#255都是立即數

add r0, r0, #1 ;r0 <- (r0+#1)

將暫存器中的資料用作運算元

mov r0, r1          ;r0 <- r1

add r0,r1, r2 ;r0 <- (r1 + r2)

將暫存器中的資料作為主存中運算元的位址,去到相應的主存位址取得運算元,用[r0]表示將r0中的資料當作運算元的位址...,[r0]!表示將r0中的資料當作運算元的位址並將操作後的結果位址給r0

ldr r0,[r1]        ;將r1指向的資料載入到r0中 

str r0, [r1]! ;將r0儲存的資料載入到r1指向的主存位址中,載入完畢r1中為操作後的位址

add r0,r1,[r2]

現將暫存器的值進行移位,再將移位後的資料當作運算元

mov r0,r2,lsl  #1   ;r2的值左移1位,結果賦給r0。

mov r0,r2,lsl r1 ;r2的值左移r1位,結果放入r0。

有6種移位操作:

lsl:邏輯左移(logical shift left),暫存器中字的低端空出的位補0。

lsr:邏輯右移(logical shift right),暫存器中字的高階空出的位補0。

asl:算術左移(arithmetic shift left),和邏輯左移lsl相同。

asr:算術右移(arithmetic shift right),移位過程中符號位不變,即如果源運算元是正數,則字的高階空出的位補0,否則補1。

ror:迴圈右移(rotate right),由字的低端移出的位填入字的高階空出的位。

rrx:帶擴充套件的迴圈右移(rotate right extended),運算元右移一位,高階空出的位用進製標誌c的值來填充,低端移出的位填入進製標誌位。

可以看作暫存器間接定址的增強版,不再直接從暫存器指向的位址中取運算元,而是從暫存器指向的位址再偏移乙個量之後再取運算元

ldr r0,[r1,#4]    ;取r1的內容當作主存的位址,在此基礎上+4byte,從該位址處取運算元。

ldr r0,[r1,#4]! ;同上,操作完畢後,!表示指令執行完畢把最後的資料位址寫到r1,即r1原來的位址+4

ldr r0,[r1,r2] ;將暫存器r1的內容加上暫存器r2的內容形成運算元的位址,取得的運算元存入暫存器r0中。

str r0, [r1,#-4];將r1中的數值減4作為位址,把r0中的資料存放到這個位址中。

ldr r0,[r1],#4 ;把r1指向的資料放到r0中,操作完成後[r1]自增4byte

ldmia  r0,     ;將r1,r2,r3,r4中的資料依次放入r0指向的記憶體位址,r0+4指向的記憶體位址...

ldmia r0, ;同上。

通過使用語句的中的標號進行定址,通常配合跳轉指令使用

bl   fcn  ;相對定址,跳轉到next處執行。

...fcn:

...

堆疊即stack,因為cpu的暫存器總是及其有限的,很多時候我們不得不使用記憶體來儲存資料,比如進行多級跳轉的時候,這時候堆疊就是乙個很好的工具,每次跳轉就將當前函式的返回位址儲存到記憶體,最底層被呼叫的子函式會最先返回,就先將壓入棧的現場返回,以此類推...,arm使用sp(r13)作為棧指標,arm設計的記憶體棧模型有2×2=4種

按照棧在記憶體增長的方向分為遞增棧遞減棧

遞增(increase)堆疊:向堆疊寫入資料時,堆疊由低位址向高位址生長。

遞減(descend)堆疊:向堆疊寫入資料時,堆疊由高位址向低位址生長。

根據堆疊指標sp指向的位置,又可以把堆疊分為滿堆疊空堆疊兩種。

滿堆疊(full stack):sp始終指向棧頂元素,壓棧的時候先移動sp,再將資料放入sp指向的位址。

空堆疊(empty stack):sp始終指向下乙個將要放入元素的位置,壓棧時先將資料放入sp指向的位址,再移動sp

最後,可以得到4種基本的堆疊型別:

:堆疊指標指向最後壓入的資料,且由高位址向低位址生長。常用這種

空增棧(ea):堆疊指標指向下乙個將要壓入資料的位址,且由低位址向高位址生長。

空減棧(ed):堆疊指標指向下乙個將要壓入資料的位址,且由高位址向低位址生長。

stmfd  sp!,{r1-r7, lr} ;將r1-r7和lr的資料按照壓入fd棧

ldmfd sp!,{r1-r7, pc} ;從fd棧中取得資料依次放入r1-r7,pc

塊拷貝定址提供了一塊記憶體和一組暫存器之間的拷貝,按照記憶體使用方式的不同,可以分為2×2=4種。位址增方向/位址減方向×先偏移/後偏移。堆疊定址就可以看作是塊拷貝定址的的乙個例項。

即:ib:increment before operating

ia:increment after operating

db:decrement before operating

da:decrement after operating

stmia  r0!,{r1—r7}  ;將r1-r7的暫存器中的值放入r0指向的位址,r0自動更新,指向操作後的位址

ARM彙編之定址方式

arm指令集之定址方式 一 arm7指令集 arm7處理器有兩個指令集 32位的arm指令集,16位的thumb指令集。1 arm指令集 效率高,密度高 2 thumb指令集 具有較高的 密度。注 1.所有的arm指令集都是有條件執行的,而thumb指令集僅有一條指令具備條件執行功能。2.arm程式...

ARM彙編之定址方式

arm 指令集之定址方式 一 arm7 指令集 arm7 處理器有兩個指令集 32 位的arm 指令集,16 位的thumb 指令集。1 arm指令集 效率高,密度高 2 thumb 指令集 具有較高的 密度。注 1.所有的arm 指令集都是有條件執行的,而thumb 指令集僅有一條指令具備條件執行...

ARM彙編指令學習之定址方式

arm處理器共有9中定址方式 1.暫存器定址 運算元的值在暫存器中,指令執行時直接取出暫存器的值來操作 mov r1,r2 r2 r1 sub r0,r1,r2 r1 r2 r0 2.立即定址 mov r0,0xff00 0xff00 r0 subs r0,r0,1 r0 1 r0 3.暫存器移位定...