- 嵌入式系統設計與實踐:Linux篇
- 季江民
- 1712字
- 2020-04-03 09:21:45
3.2 ARM指令的尋址方式
所謂尋址方式就是處理器根據指令中給出的地址信息來尋找物理地址的方式。目前ARM指令系統支持如下幾種常見的尋址方式。
3.2.1 立即尋址
立即尋址也叫立即數尋址,如圖3.1所示。這是一種特殊的尋址方式,操作數本身就在指令中給出,只要取出指令也就取到了操作數。這個操作數被稱為立即數,對應的尋址方式也就叫做立即尋址。

圖3.1 立即尋址示意圖
例如:以下指令:
ADD R0 , R0 , #1 ; R0←R0+1 ADD R0 , R0 , #0x03 ; R0←R0+0x03
在以上兩條指令中,第二個源操作數即為立即數,要求以“#”為前綴,對于以十六進制表示的立即數,還要求在“#”后加上“0x”或“&”。
3.2.2 寄存器尋址
寄存器尋址就是利用寄存器中的數值作為操作數,如圖3.2所示。這種尋址方式是各類微處理器經常采用的一種方式,也是一種執行效率較高的尋址方式。

圖3.2 寄存器尋址示意圖
例如:以下指令:
ADD R0, R1, R2 ; R0←R1+R2
該指令的執行效果是將寄存器R1和R2的內容相加,其結果存放在寄存器R0中。
3.2.3 寄存器間接尋址
寄存器間接尋址就是以寄存器中的值作為操作數的地址,如圖3.3所示,而操作數本身存放在存儲器中。

圖3.3 寄存器間接尋址示意圖
例如:以下指令:
ADD R0, R1, [R2] ; R0←R1+[R2] LDR R0, [R1] ; R0←[R1] STR R0, [R1] ; [R1]←R0
在第一條指令中,以寄存器R2的值作為操作數的地址,在存儲器中取得一個操作數后與R1相加,結果存入寄存器R0中。
第二條指令將以R1的值為地址的存儲器中的數據傳送到R0中。
第三條指令將R0的值傳送到以R1的值為地址的存儲器中。
3.2.4 基址尋址
如圖3.4所示,基址寄存器Rb的內容與指令中給出的形式地址A相加,形成操作數有效地址,基址尋址需要特征位給予指示有效地址的計算:
EA=(Rb)+A

圖3.4 基址尋址示意圖
3.2.5 變址尋址
如圖3.5所示,變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內容與指令中給出的地址偏移量相加,從而得到一個操作數的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。

圖3.5 變址尋址示意圖
采用變址尋址方式的指令常見有以下幾種形式,如下所示:
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的內容加上4形成操作數的有效地址,從而取得操作數存入寄存器R0中。
在第二條指令中,將寄存器R1的內容加上4形成操作數的有效地址,從而取得操作數存入寄存器R0中,然后,R1的內容自增4個字節。
在第三條指令中,以寄存器R1的內容作為操作數的有效地址,從而取得操作數存入寄存器R0中,然后,R1的內容自增4個字節。
在第四條指令中,將寄存器R1的內容加上寄存器R2的內容形成操作數的有效地址,從而取得操作數存入寄存器R0中。
3.2.6 多寄存器尋址
采用多寄存器尋址方式,一條指令可以完成多個寄存器值的傳送。這種尋址方式可以用一條指令完成傳送最多16個通用寄存器的值。如以下指令:
LDMIA R0 , { R1, R2, R3, R4 } ; R1←[R0] ;R2←[R0+4] ;R3←[R0+8] ;R4←[R0+12]
該指令的后綴IA表示在每次執行完加載/存儲操作后,R0按字長度增加,因此,指令可將連續存儲單元的值傳送到R1—R4。
3.2.7 相對尋址
與基址尋址和變址尋址方式相類似,相對尋址以程序計數器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數的有效地址。以下程序段完成子程序的調用和返回,跳轉指令BL采用了相對尋址方式:
BL NEXT ;跳轉到子程序NEXT處執行 …… NEXT …… MOV PC, LR ;從子程序返回
3.2.8 堆棧尋址
堆棧是一種數據結構,按先進后出(First In Last Out, FILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。
當堆棧指針指向最后壓入堆棧的數據時,稱為滿堆棧(Full Stack),而當堆棧指針指向下一個將要放入數據的空位置時,稱為空堆棧(Empty Stack)。
同時,根據堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧(Decending Stack),當堆棧由低地址向高地址生成時,稱為遞增堆棧,當堆棧由高地址向低地址生成時,稱為遞減堆棧。這樣就有四種類型的堆棧工作方式,ARM微處理器支持這四種類型的堆棧工作方式,即:
滿遞增堆棧:堆棧指針指向最后壓入的數據,且由低地址向高地址生成。
滿遞減堆棧:堆棧指針指向最后壓入的數據,且由高地址向低地址生成。
空遞增堆棧:堆棧指針指向下一個將要放入數據的空位置,且由低地址向高地址生成。
空遞減堆棧:堆棧指針指向下一個將要放入數據的空位置,且由高地址向低地址生成。