arm64汇编之寻址

【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的值存到[]的内存地址

    推荐阅读