第四十一讲 ARM常用汇编指令
写在前面:看到这里你也许会疑惑,前面还有几讲呢?是的,前面几讲我并没有打算写。没有写的原因并不是它不重要,也不是我懒。仅仅是因为我对前面的理解也还不够深刻。我现在只能知道表面的一些东西,怕这样会误导大家。所以我从后面实践开始。我回去慢慢探索,慢慢理解。毕竟实践出真知嘛。好了,废话就到这里了,接下来进入正题。
一、汇编格式
1、格式
label:instruction @ comment
2、格式介绍
- lable:标号
- instruction:具体汇编指令
- comment:注释内容
二、常用段名
- .text:代码段
- .data:初始化数据段
- .bss:未初始化数据段
- .rodata:只读数据段
- .section:自定义段
三、常见操作
1、定义全局标号
2、字节对齐
-
.align 字节对齐 .align 2(2字节对齐)
四、常用汇编指令
指令 | 功能 | 示例 |
---|
mov | 寄存器数据或者立即数拷贝到另一个寄存器 | mov r0, r1 将r1寄存器的值拷贝到r0 mov r0, #0x12 将r0赋值为0x12 | mrs | 读取程序状态寄存器 | mrs r0, cpsr 将cprr寄存器拷贝到r0 | msr | 写程序状态寄存器 | msr cpsr, r0 将r0的值拷贝到cpsr寄存器 | mrc | 读cp15协处理器 | 用法与msr类似 | mcr | 写cp15寄存器 | 用法与msr类似 | ldr | 把内存数据或者是立即数加载到寄存器 | ldr r0, =0x80000000 将r0寄存器赋值为0x80000000 ldr r1,[r0] 将r0指向的地址的值赋值给r1([]类似指针) | str | 把寄存器的值写入到内存 | str r1,[r0] 将r1的值写入r0指向的地址 | push | 把寄存器列表压入栈中 | push {r0~r3,r12} 将r0、r1、r2、r3、r12的值压入栈中 | pop | 从栈中恢复寄存器列表 | pop {r0~r3,r12} 从栈中恢复r0、r1、r2、r3、r12的值 | b | 跳转到目标地址 | b main 跳转到main函数(不可逆) | bl | 跳转到目标地址,并将pc值保存到lr寄存器中 | bl main 跳转到main函数,并将pc值保存到lr寄存器 | add | 加法运算 | add r1,r2,r3 r1=r2+r3 add r1,r2 r1=r1+r2 | sub | 减法运算 | 同加法 | mul | 乘法运算 | 同加法 | udiv | 除法运算 | 同加法 | and | 与 | and r1,r2,r3 r1=r2&&r3
| orr | 或 | orr r1,r2,r3 r1=r2||r3 | bic | 位清除 | bic r1,r2,r3
|
|