ARM裸機(jī)開(kāi)發(fā)筆記4ARM尋址方式
立即(數(shù))尋址
操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式為立即尋址
ADD R0,R0,#1 ;R0<-R0+1
ADD R0,R0,#ox3f ;R0<-R0+0x3f
以上指令中,第二個(gè)源操作數(shù)即為立即數(shù)。立即數(shù)以#開(kāi)頭
寄存器尋址
利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。
ADD R0,R1,R2 :R0<-R1+R2
該指令將寄存器R1和R2的內(nèi)容相加放到R0中。
寄存器間接尋址
以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中
ADD R0,R1,[R2] ;R0<-R1+[R2]
LDR R0,[R1] ;R0<-[R1]
[]表示取寄存器內(nèi)容處的存儲(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]
多寄存器尋址
一條指令可以完成多個(gè)寄存器值的傳送。一條指令完成傳送最多16個(gè)通用寄存器的值
LDMIA R0,{R1,R2,R3,R4} ;R1<- [R0] R2<-[R0+4] R3<-[R0+8] R4<-[R0+12]
IA表示每次執(zhí)行完加載操作后,R0按字長(zhǎng)度增加
相對(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 ;從子程序返回
椎棧尋址
椎棧指針總是指向棧頂
遞增椎棧:向高地址方向生長(zhǎng)
遞減椎棧:向低地址方向生長(zhǎng)
滿椎棧:椎棧指針指向最后壓入椎棧的有效數(shù)據(jù)項(xiàng)
空椎棧:椎棧指針指向下一個(gè)要放入數(shù)據(jù)的空位置
評(píng)論