尋址方式在C語(yǔ)言里面也可以稱為一個(gè)內(nèi)存操作叶圃,說(shuō)到尋址方式,我們就會(huì)想哪里有地址践图,當(dāng)然就是存儲(chǔ)器掺冠,而存儲(chǔ)器就包括內(nèi)存,外存码党,外存就比如硬盤赫舒,內(nèi)存就比如寄存器。也就是說(shuō)我們想操作它們要怎么去尋址闽瓢,現(xiàn)在我把常用的ARM尋址方式做了一個(gè)總結(jié)。
1心赶,立即數(shù)尋址:常量尋址扣讼,比如“ADD R0,R0,#0X3F”也就是操作,條件缨叫,狀態(tài)椭符,Rd(目標(biāo)寄存器),Rn(原寄存器)耻姥,操作數(shù)這六個(gè)部分销钝,對(duì)比來(lái)說(shuō)就是把R0自己加上0x3F這樣一個(gè)立即數(shù),并且把加上的值還是給它自己琐簇。這是最簡(jiǎn)單的尋址方式蒸健。
2,寄存器尋址:比如“ADD R0,R1,R2”就是R1加R2婉商,然后在把值存給R0似忧。這個(gè)時(shí)候我們實(shí)際上就是去尋找寄存器,所以稱為寄存器尋址丈秩。
3盯捌,寄存器間接尋址:比如“LDR R0,[R1]”“STR R0[R1]”,“LDR”和“STR”就是操作把數(shù)據(jù)在內(nèi)存和寄存器之間進(jìn)行傳遞的蘑秽,通過(guò)它們我們才能訪問(wèn)內(nèi)存地址饺著。“LDR R0,[R1]”意思就是把R1里面所指向的內(nèi)存地址的值賦到R0肠牲。比如說(shuō)R1里面的值是0*00000103幼衰,它不會(huì)直接拷貝,因?yàn)樗鼤?huì)把這個(gè)值當(dāng)做內(nèi)存里面的地址埂材,然后去地址里面找值塑顺,然后在給R0。同樣STR也是這樣一個(gè)道理⊙暇埽“STR R0,[R1]”是把R0的值放到R1的內(nèi)存地址里面去扬绪。
4,寄存器移位尋址:這個(gè)又設(shè)計(jì)到位運(yùn)算裤唠,就要記住向左是乘向右是除挤牛,“ADD R3,R2,R1,LSL #2”這個(gè)指令如果拋開(kāi)LSL后面這一段,就是把R1加R2給R3种蘸,加上LSL #2就表示左移兩個(gè)立即數(shù)墓赴。也就表示R1左移兩位再加R2然后在給R3。
5航瞭,基址地址尋址:“LDR R0,[R1#4]”也就是說(shuō)把R1里面的值加上4這樣的立即數(shù)所指向的地址诫硕,然后在給它讀到它所指向的地址R0】睿“LDR R0,[R1]#4”這個(gè)就是R1所指向的內(nèi)存地址章办,取出里面的值,然后再加上這個(gè)立即數(shù)4滨彻,然后再給R0藕届。“LDR R0,[R1,R2]”R1的值加上R2的值亭饵,再去找這個(gè)所指向的內(nèi)存然后給R0休偶。
6,多寄存器尋址:“LDMIA R0,{R1,R2,R3,R4}”就是批量操作辜羊。
7踏兜,相對(duì)尋址:與跳轉(zhuǎn)相關(guān)“BL NEXT”就表示跳轉(zhuǎn)到NEXT,并且把當(dāng)前的狀態(tài)保存到寄存器里面八秃”勇螅“MOV PC,LR”當(dāng)MOV后面跟的是LR,也就表示子函數(shù)的返回調(diào)用喜德,所以它也有一個(gè)跳轉(zhuǎn)的作用山橄,也就是相當(dāng)于一個(gè)子程序的返回。
就是用數(shù)值去除以四舍悯,然后最后能夠整除在0到25之間的就是有效的航棱,因?yàn)樗且蛴椅灰婆紨?shù)位,從進(jìn)位上看萌衬,向左移是乘饮醇,向右移就是除。