所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式。目前 ARM 指令系統(tǒng)支持如下幾種常見的尋址方式。
立即尋址
立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址。例如以下指令:
ADD R0 , R0 ,# 1 ; R0 ←R0+1
ADD R0 , R0 ,# 0x3f ; R0 ←R0+0x3f
在以上兩條指令中,第二個(gè)源操作數(shù)即為立即數(shù),要求以 “ # ” 為前綴,對(duì)于以十六進(jìn)制表示的立即數(shù),還要求在 “ # ” 后加上 “ 0x ” 或 “ & ” 。
寄存器尋址
寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。以下指令:
ADD R0 , R1 , R2 ; R0 ←R1+R2
該指令的執(zhí)行效果是將寄存器 R1 和 R2 的內(nèi)容相加,其結(jié)果存放在寄存器 R0 中。
寄存器間接尋址
寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如以下指令:
ADD R0 , R1 , [R2] ; R0 ←R1+[R2]
LDR R0,[R1] ; R0 ←[R1]
STR R0,[R1] ;[R1]← R0
在第一條指令中,以寄存器 R2 的值作為操作數(shù)的地址,在存儲(chǔ)器中取得一個(gè)操作數(shù)后與 R1 相加,結(jié)果存入寄存器 R0 中。
第二條指令將以 R1 的值為地址的存儲(chǔ)器中的數(shù)據(jù)傳送到 R0 中。
第三條指令將 R0 的值傳送到以 R1 的值為地址的存儲(chǔ)器中。
基址變址尋址
基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。采用變址尋址方式的指令常見有以下幾種形式,如下所示:
LDR R0 , [R1 ,# 4] ; R0 ←[R1+4]
LDR R0 , [R1 ,# 4] ! ; R0 ←[R1+4]、R1←R1+4
LDR R0 , [R1] ,# 4 ; R0 ←[R1]、R1←R1+4
LDR R0 , [R1 , R2] ; R0 ←[R1+R2]
在第一條指令中,將寄存器 R1 的內(nèi)容加上 4 形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器 R0 中。
在第二條指令中,將寄存器 R1 的內(nèi)容加上 4 形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器 R0 中,然后, R1 的內(nèi)容自增 4 個(gè)字節(jié)。
在第三條指令中,以寄存器 R1 的內(nèi)容作為操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器 R0中,然后, R1 的內(nèi)容自增 4 個(gè)字節(jié)。
在第四條指令中,將寄存器 R1 的內(nèi)容加上寄存器 R2 的內(nèi)容形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器 R0 中。
多寄存器尋址
采用多寄存器尋址方式,一條指令可以完成多個(gè)寄存器值的傳送。這種尋址方式可以用一條指令完成傳送最多 16 個(gè)通用寄存器的值。以下指令:
LDMIA R0 , {R1 , R2 , R3 , R4} ; R1 ←[R0]; R2 ←[R0+4]; R3 ←[R0+8];
R4←[R0+12]
該指令的后綴 IA 表示在每次執(zhí)行完加載 / 存儲(chǔ)操作后, R0 按字長(zhǎng)度增加,因此,指令可將連續(xù)存儲(chǔ)單元的值傳送到 R1 ~ R4 。
相對(duì)尋址
與基址變址尋址方式相類似,相對(duì)尋址以程序計(jì)數(shù)器 PC 的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令 BL 采用了相對(duì)尋址方式:
BL NEXT ;跳轉(zhuǎn)到子程序 NEXT 處執(zhí)行
……
NEXT
……
MOV PC,LR ;從子程序返回
堆棧尋址
堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出( First In Last Out , FILO )的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。
當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱為滿堆棧( Full Stack ),而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱為空堆棧( Empty Stack )。
同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧( Ascending Stack )和遞減堆棧( Decending Stack ),當(dāng)堆棧由低地址向高地址生成時(shí),稱為遞增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱為遞減堆棧。這樣就有四種類型的堆棧工作方式, ARM 微處理器支持這四種類型的堆棧工作方式,即:
- 滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。
- 滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。
- 空遞增堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。
- 空遞減堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。