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