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