指令解析

b reset:实现
pc指针 将abc的地址的内容 加载到pc指针中
即为跳转到0x1000 进行运行
- 即可理解如下代码



.global __end_vect 为实现对向量表结束的标识
在_end_vect:后面 使用的 .balignl 16,0xdeadbeef 在如果没有16字节对齐时候 进行内存填充 直到是16字节对齐为止
- badcode填充
作者在这里进行了一次的实现badcode代码填充,进行对当前编译时候的地址填充

linkage头文件
-
linkage 文件分析

-
entry name define
ENTRY(name)
.global SYMBOL_NAME (name):
LENTRY (name)
展开怎么计算?这句话要看 SYMBOL_NAME 的宏定义 为x
故而 .global SYMBOL_NAME (name):\ 为 x
LENTRY (name)展开的事件处理为
#define LENTRY(name)\
ALIGN;\ // = _ALIGN .align 4 //为4字节对齐
SYMBOL_NAME_LABEL(name) // 直接转化成(X) =X
结果为
.global name
.align 4
name
bx lr
执行BX LR的意义是"跳转到LR寄存器里的地址执行"
- ENDPROC(sbp)展开
type sbp STT_FULL //伪指令 说明下面为函数
END(sbp)详细张开如下
#ifndef END
#define END(sbp)
.size sbp , .-sbp //说明 :当前sbp 有多大
#endif
设置svc模式
- spsr寄存器设置

6 ,7 位置的if 禁止中断
4:0为 位 设置为svc32模式

0xd3实现了同时进中断和模式位
cp15协处理器操作

cp15中包括 cache缓存管理 MMU内存管理
cp12 13 保留给arm公司以后用
cp11 为双精度浮点计算
cp 10 为单精度浮点计算
- mrc 语法学习
- 可在Arm手册中中查询到对应寄存器
- mrc解析
mrc p15, opc1, CRn, CRm, opcl2
对应起来为
mrc p15, 0 , c1 ,c0 ,0
即为将 SCTRL寄存器读入到r0中- bic解析:
将r0 寄存器中的 第十三位进行清零

- ldr 解析:ldr r0 , =_start
将 _start的地址放入r0中- mcr 解析 :mcr p15 ,0,r0,c12,c0 ,0
将r0中的地址存入cp15中的c12 c0这个寄存器中 作用如下图所示:

如果在 设置VBAR寄存器 使得vb向量表映射到任何地址
即为如果将 r0中的地址为0x38400 写入到p15 c12 c0 (而其原本起始地址为0x20000映射到了 0x38400 上)
发生中断后就会跳转到vb向量的0x38400地址上进入中断处理程序