1、加载,存储指令
1.1 MOV
MOV <Xd|SP>, <Xn|SP>
MOV <Xd|SP>, #<imm16>
- 常用于寄存器之间的搬移和立即数搬移,
- 仅仅支持imm16, 0-4096大小范围的立即数操作
1.2 MRS,MSR访问系统寄存器
MRS: 状态寄存器 --> 通用寄存器的传送指令。
MSR: 通用寄存器 --> 状态寄存器的传送指令。
注意:在ARMv7里通过CP15协处理器方位系统寄存器
mrs x10, sctlr_el1 // 读取sctlr_el1系统控制寄存器属性配置
msr sctlr_el1 , x10 // 设置sctlr_el1
还可以访问PSTATE寄存器一些重要的相关字段。
特殊的系统寄存器 | 说明 |
CurrentEL | 当前系统的异常等级 |
DAIF | 获取和设置PSTATE中的DAIF掩码, 比如:可用来关闭/打开本地处理器中断 |
NACV | 获取和设置PSTATE中的条件掩码 |
PAN | 获取和设置PSTATE中的PAN字段 |
SPSel | 获取和设置当前SP寄存器 |
UAO | 获取和设置PSTATE中的UAO字段 |
1.3 LDR, STR
LDR Xt, [Xn] //以Xn寄存器中的内容作为内存地址,加载此内容地址的内容到Xt目标寄存器中
LDR Xt, =<label> // 把label标记的地址加载到Xt寄存器中
STR Xt, [Xn] //把Xt寄存器中的内容存储到Xn寄存器的内容地址中
#define MY_PC_OFFSET 0x100
my_data:
.quad 0x09
// 1. 测试ldr地址偏移模式
mov x1, 0x80000
mov x3, 16
/* 读取0x80000地址的值到x0寄存器*/
ldr x0, [x1]
ldr x1, MY_PC_OFFSET //读取当前PC+0x100的地址的内容到x1中
ldr x4, =my_data // 把my_data对应的地址加载到x4寄存器中
ldr x5, [x4] //加载x4内存地址对应的值到x5中
得到的结果:
0x80000对应的memory空间:8x8 = 64bit的空间
1.4 LDXR, STXR独占内存访问指令
LDXR <Xt>, [<Xn|SP>{,#0}]
STXR <Ws>, <Xt>, [<Xn|SP>{,#0}]
<Ws>: Is the 32-bit name of the general-purpose register into which the status result of the store exclusive is written,表示写的状态是成功还是失败0 If the operation updates memory.1 If the operation fails to update memory.<Xt>:Is the general-purpose register to be transferred.<Xn|SP>:Is the general-purpose base register or stack pointer.
独占内存访问指令,LDXR指令尝试在内存总线中申请一个独占访问的锁,然后访问一个内存地址。STXR指令会往刚才LDXR指令已经申请独占访问的内存地址写入新内容。LDXR和STXR指令通常组合使用完成一些同步操作,比如linux内核的自旋锁。
另外还有LDXP,STXP也是支持多字节独占访问的指令;还有LDAR, STLR,内存屏障原语操作
1.4 LDP, STP 多字节内存加载和存储指令
LDP <Xt1>, <Xt2>, [<Xn|SP>{, #<imm>}]
- 说明:LDP 以Xn/SP 寄存器的值为基地址,然后读取Xn|SP寄存器的值+imm地址的值到Xt1寄存器,读取Xn|SP寄存器的值+imm+8地址的值到Xt2寄存器,
STP <Xt1>, <Xt2>, [<Xn|SP>{, #<imm&