尋址方式在C語言里面也可以稱為一個內存操作,說到尋址方式,我們就會想哪里有地址,當然就是存儲器,而存儲器就包括內存,外存,外存就比如硬盤,內存就比如寄存器。也就是說我們想操作它們要怎么去尋址,現在我把常用的ARM尋址方式做了一個總結。
1,立即數尋址:常量尋址,比如“ADD R0,R0,#0X3F”也就是操作,條件,狀態,Rd(目標寄存器),Rn(原寄存器),操作數這六個部分,對比來說就是把R0自己加上0x3F這樣一個立即數,并且把加上的值還是給它自己。這是最簡單的尋址方式。
2,寄存器尋址:比如“ADD R0,R1,R2”就是R1加R2,然后在把值存給R0。這個時候我們實際上就是去尋找寄存器,所以稱為寄存器尋址。
3,寄存器間接尋址:比如“LDR R0,[R1]”“STR R0[R1]”,“LDR”和“STR”就是操作把數據在內存和寄存器之間進行傳遞的,通過它們我們才能訪問內存地址。“LDR R0,[R1]”意思就是把R1里面所指向的內存地址的值賦到R0。比如說R1里面的值是0*00000103,它不會直接拷貝,因為它會把這個值當做內存里面的地址,然后去地址里面找值,然后在給R0。同樣STR也是這樣一個道理。“STR R0,[R1]”是把R0的值放到R1的內存地址里面去。
4,寄存器移位尋址:這個又設計到位運算,就要記住向左是乘向右是除,“ADD R3,R2,R1,LSL #2”這個指令如果拋開LSL后面這一段,就是把R1加R2給R3,加上LSL #2就表示左移兩個立即數。也就表示R1左移兩位再加R2然后在給R3。
5,基址地址尋址:“LDR R0,[R1#4]”也就是說把R1里面的值加上4這樣的立即數所指向的地址,然后在給它讀到它所指向的地址R0。“LDR R0,[R1]#4”這個就是R1所指向的內存地址,取出里面的值,然后再加上這個立即數4,然后再給R0。“LDR R0,[R1,R2]”R1的值加上R2的值,再去找這個所指向的內存然后給R0。
6,多寄存器尋址:“LDMIA R0,{R1,R2,R3,R4}”就是批量操作。
7,相對尋址:與跳轉相關“BL NEXT”就表示跳轉到NEXT,并且把當前的狀態保存到寄存器里面。“MOV PC,LR”當MOV后面跟的是LR,也就表示子函數的返回調用,所以它也有一個跳轉的作用,也就是相當于一個子程序的返回。
就是用數值去除以四,然后最后能夠整除在0到25之間的就是有效的,因為它是要向右位移偶數位,從進位上看,向左移是乘,向右移就是除。