【arm64汇编之寻址】[addr]表示寻址,包含在[]号之内的必然有一个寄存器,这个寄存器的值是一个内存地址,称之为Base Register,可以理解为c语言里面的一个指针,Base Register在寻址之前或者之后都可以进行一些运算操作,操作结果可以更新到Base Register,也可以不更新到Base Register,寻址方式分为四种:
1.最简单形式:Base Register模式,可类比于: *(ptr)<->value,下面的x1不会变
ldr表示将内存中的值读取到寄存器中,ldr的右操作数一定是内存地址的
ldr x0, [x1]/* [x1] -> x0 */
取x1的值为地址,取该内存地址的值,赋值给x0寄存器
2.尾部带感叹号!带形式,称之为Pre-Index寻址模式,可类比于:*(++ptr)<->value
下面的x1会先更新,然后用来寻址取值
str表示将寄存器中的值存放到内存地址
str x2, [x1,x2,LSL#2]!
/* x1 = x1 + x2 << 2;
x2->[x1];
*/
先计算出x1,用来寻址,会改变x1,然后将x2的值存储在内存地址为x1的地址
3.单纯的[REG]的形式:Post-Index寻址模式,可类比于:*(ptr++)<->value
下面的x1先寻址,在更新x1
ldr x3, [x1],x2,LSL#2
这有点类似于base register的变种
先取地址为x1的值赋值给寄存器x3,然后在修改x1=x1+x2 << 2
4.其他的形式:Offset寻址模式,可类比于*(ptr +xxx) <-> value
下面的x1不会更新
str x2,[x1,x2,LSL#2]
将寄存器x2的值存放到 地址为x1+x2 << 2的内存
总结:[]宗括号里面表示地址运算,最终得到一个地址, ldr 寄存器(例如x1),[] 表示取[]内存地址的值赋给寄存器
str 寄存器(例如x2) , [] 表示将x2的值存到[]的内存地址