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 | 没有溢出 |
本文详细介绍了ARM架构中的基本指令,包括分支、算数、逻辑、比较、数据传输、状态寄存器和其他指令,以及它们的功能和用法。通过实例展示了如何进行无条件跳转、位操作、数值运算、条件判断等操作。此外,还涵盖了执行条件运算符及其意义,为理解和使用ARM汇编语言提供了全面的指导。

7590

被折叠的 条评论
为什么被折叠?



