ARM汇编语言
ARM 汇编语言
ARM基本指令
- 分支指令
指令 | 功能 | 功能 |
---|---|---|
B label {f,b} | 移动到label, label后面的选项f、b是位于下、上侧的label | b call_kernel |
BL label {f,b} | 和B相同,但lr中记录bl下一条指令的地址 | bl cache_on |
BX label {f,b} | 带状态切换的无条件跳转 | |
BLX label {f,b} | 带链接和状态切换的无条件跳转 |
- 算数运算指令
指令 | 功能 | 功能 |
---|---|---|
ADD X Y Z | X中保存Y与Z之和 | add r12, r12, #4*5 |
SUB X Y Z | X中保存Y减Z之差 | sub pc, lr, r0 |
- 逻辑运算符
指令 | 功能 | 功能 |
---|---|---|
BIC X Y Z | 在Y中解除Z中设置的位并保存到X X=Y&~Z | bic r3, r3, #0x3f00 |
EOR X Y Z | 将Y和Z执行exclusive or运算并保存到X X=Y^Z | eor r1, r1, r6 |
ORR X Y Z | Rd=Rn1N | orr r0, r0, #0x002d |
ANDX Y Z | 将Y和Z执行and运算的结果值保存到X | orr r0, r0, #0x002d |
- 比较运算指令
指令 | 功能 | 功能 |
---|---|---|
CMP X Y | 比较X和Y并更新状态标签 | cmp r1,r2 |
TEQ X Y | 检查X和Y的值是否一致 | teq r6, ip |
TST X Y | 检查Y中设置的位是否全部设置到X | tst r1, r1 |
- 数据传输指令
指令 | 功能 | 功能 |
---|---|---|
LDR X Y Z | 将Y+Z的地址中保存的值加载到X | ldr r1, [r6, #0] |
LDM X{!} Rx-Ry | 从Rd中保存的地址依次取值并读入rx~ry的寄存器,每次都更新地址,后面有!时x的值会更新 | ldmfd sp!, {r4-r7, r9, pc } |
STM X{!} Rx-Ry | 将x指向的地址的值依次写入寄存器列表Rx-Ry,后面有!时x的值不会更新 | stmfd sp!, {r4, r5, r6, r7} |
- 状态寄存器指令
指令 | 功能 | 功能 |
---|---|---|
MRS X CPSR | 将CPSR的值读入X | msr r2,cpsr |
MSR CPSR X | 检查X和Y的值是否一致 | mrs cpsr, r2 |
- 其他指令
指令 | 功能 | 功能 |
---|---|---|
ADR X label | 将label的地址保存到X | adr r12, proc_types |
MOV X Y | 将Y的值保存到X | mov r0, r1 |
- 执行条件运算符
后缀 | 标签 | 含义 |
---|---|---|
eq | z=1 | 相等 |
ne | z=0 | 不相等/标志 |
hi | c=1,z=0 | 无符号数大于 |
cs/hs | c=1 | 无符号数大于或等于 |
cc/lo | c=0 | 无符号数小于 |
ls | c=0,z=1 | 无符号数小于或等于 |
gt | z=0,n=v | 有符号数大于 |
ge | n=v | 有符号数大于或等于 |
lt | n!=v | 有符号数小于 |
le | z=1,n!=v | 有符号数小于或等于 |
mi | n=1 | 负数 |
pl | n=0 | 整数或0 |
vs | v=1 | 溢出 |
vc | 没有溢出 |