学习汇编的目的:初始化C语言运行环境。
GNU汇编语法
label:instruction@comment
label:标号,表示地址位置,有些指令前面可能会有标号
instruction:指令,即汇编指令或者伪指令
@:注释符号
comment:注释内容
示例代码:
add:
MOVS R0, #0X12 @设置 R0=0X12
注意! ARM中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用
小写,但是不能大小写混用。
用户可以使用.section伪操作来定义一个段,汇编系统预定义了一些段名:
.text 表示代码段
.data 表示初始化的数据段
.base 表示未初始化的数据段
.rodata 表示只读数据段
Contex-A7常用的汇编指令
处理器做的最多的事情就是在处理器内部来回传递数据,常见的操作有:
- 将数据从一个寄存器传递到另一个寄存器。
- 将数据从一个寄存器传递到特殊寄存器,如CPSR和SPSR.
- 将立即数传递到寄存器。
数据传输常用的指令有三个:MOV、MRS、MSR.
处理器内部传输指令
指令 | 目的 | 源 | 描述 |
---|---|---|---|
MOV | R0 | RI | 将R1里面的数据复制到R0中 |
MRS | R0 | CPSR | 将特殊寄存器CPSR里面的数据复制到R0 |
MSR | CPSR | RI | 将R1里面的数据复制到特殊寄存器CPSR里 |
存储器访问指令
指令 | 描述 |
---|---|
LDR Rd, [Rn , #offset] | 从存储器Rn+offset的位置读取数据存放到 Rd中 |
STR Rd, [Rn, #offset] | 将Rd中的数据写入到存储器中的 Rn+offset位置。 |
压栈和出栈指令
指令 | 描述 |
---|---|
PUSH | 将寄存器列表入栈 |
POP | 从栈中恢复寄存器列表 |
PUSH 和POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”。
跳转指令
有多种跳转指令
- 直接使用调转指令B、BL、BX等。
- 直接向PC寄存器里面写入数据。
指令 | 描述 |
---|---|
B | 调转到label,如果跳转范围超过+/-2KB,可以指定B.W |
BX | 间接跳转,跳转到存放Rm中的地址处,并且切换指令集 |
Bl | 跳转到标号地址,并将返回地址保存在LR中 |
BlX | 结合BX和BL的特点,跳转到Rm指定的地址,并将返回地址保存在LR中,切换指令集 |