既然是和内存相关的,那就是两种,一种存,一种取。一般来说
L打头的基本都是取值指令,如 LDR LDP;
S打头的基本都是存值指令,如 STR STP;
例:
ldr x0, [x1]; // 从`x1`指向的地址里面取出一个 64 位大小的数存入 `x0`
ldp x1, x2, [x10, #0x10]; // 从 x10 + 0x10 指向的地址里面取出 2个 64位的数,分别存入x1, x2
str x5, [sp, #24]; // 把x5的值(64位数值)存到 sp+24 指向的内存地址上
stp x29, x30, [sp, #-16]!; // 把 x29, x30的值存到 sp-16的地址上,并且把 sp-=16.
ldp x29, x30, [sp], #16; // 从sp地址取出 16 byte数据,分别存入x29, x30. 然后 sp+=16;
其中寻址的格式由分为下面这3种类型:
[x10, #0x10] // signed offset。 意思是从 x10 + 0x10的地址取值
[sp, #-16]! // pre-index。 意思是从 sp-16地址取值,取值完后在把 sp-16 writeback 回 sp
[sp], #16 // post-index。 意思是从 sp 地址取值,取值完后在把 sp+16 writeback 回 sp