ARM汇编3
一. 什么是协处理器?
1.1. SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。
1.2. ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15.(cp:coprocessor)
1.3. 协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关
二. MRC & MCR的使用方法
2.1. 用法格式
a. mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}
b. opcode_1:对于cp15永远为0
c. Rd:ARM的普通寄存器
d. Crn:cp15的寄存器,合法值是c0~c15
e. Crm:cp15的寄存器,一般均设为c0
f. opcode_2:一般省略或为0
三. 8种后缀
3.1. 相关后缀
3.1.1. ia(increase after)先传输,再地址+4
3.1.2. ib(increase before)先地址+4,再传输
3.1.3. da(decrease after)先传输,再地址-4
3.1.4. db
3.1.5. fd(full decrease)满递减堆栈
3.1.6. ed(empty decrease)空递减堆栈
3.1.7. fa(·······) 满递增堆栈
3.1.8. ea(·······)空递增堆栈
3.2. 四种栈
3.2.1. 空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出
3.2.2. 满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针
3.2.3. 增栈:栈指针移动时向地址增加的方向移动的栈
3.2.4. 减栈:栈指针移动时向地址减小的方向移动的栈
四. 伪指令
4.1. 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码
4.2. 伪指令的意义在于指导编译过程。
4.3. 伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
4.4. 汇编中一些符号
a. @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
b. :以冒号结尾的是标号
c. . 点号在gnu汇编中表示当前指令的地址
d. # 立即数前面要加#或$,表示这是个立即数
4.5. 常用gnu伪指令
a. .global _start @ 给_start外部链接属性
b. .section .text @ 指定当前段为代码段
c. .ascii .byte .short .long .word
d. .quad .float .string @ 定义数据
e. .align 4 @ 以16字节对齐
f. .balignl 16 0xabcdefgh @ 16字节对齐填充
g. .equ @ 类似于C中宏定义
h. .end @标识文件结束
i. .include @ 头文件包含
4.6. adr与ldr伪指令
a. adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理;
b. adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
c. ldr加载的地址和链接时给定的地址有关,由链接脚本决定。
ps: ldr指令: ldr r0, #0xff
伪指令: ldr r0, =0xfffl @涉及到合法/非法立即数,涉及到ARM文字池
参考《朱老师.1.2ARM裸机课件》

浙公网安备 33010602011771号