寻址方式在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之间的就是有效的,因为它是要向右位移偶数位,从进位上看,向左移是乘,向右移就是除。