自学嵌入式第四十四天:汇编
一、目的
初始化硬件,引导启动C语言程序;
引导C语言启动:
(1)初始化异常向量表;
(2)初始各工作模式的栈指针寄存器;
(3)开启ARM内核中断允许;
(4)将工作模式设置为user模式;
(5)完成上述工作后,引导程序进入c语言主函数执行;
二、MOV
MOV{S}<c> <Rd>, #<const>
MOV{S}<c> <Rd>, <Rm>
mvn r1, r1 //把r1按位取反后放回r1
三、立即数
1.能被编译器编译进指令中的数字量称为立即数;
2.立即数的判断方法:
(1)如果一个数在0-255中间一定是立即数;
(2)如果将一个数展开为二级制形式,存在一种循环右移偶数位方式,使得移位后的结果的高24位全为0,则是立即数;
3.imm12(立即数):4位旋转位放循环右移次数/2;imm8放低八位;
四、ADD、SUB
add r0, r1, #0x4 //r0 = r1 + 4
add r2, r0, r1 //r2 = r0 + r1
add r2, r0, r1, lsl #2 //r2 = r0 + 逻辑左移2位的r1
五、LDR加载指令
ldr r0, =0xffff //可以赋不是立即数
六、BIC/ORR
bic:指定位清零;
bic r0, r1, #0x04 //清第三低位,r0 = r1 & (~(0x04))
orr:指定位置1;
orr r0, r1 //r0 = r0 | r1;
七、状态
CPSR寄存器中条件判断标志位
N: 符号标志位:上条指令执行结果最高位bit31为1,则 N = 1, 当结果作为有符号解释时为负值
Z: 零值标志位:上条指令执行结果为0(即bit0 - bit31 均为0),则 Z = 1;
C: 进位标志位:进行无符号解读,如果在加法过程中进位或者减法时没有借位,则为 C = 1,否则 C = 0
V: 溢出标志位:进行有符号解读,是否发生溢出 -2^31 - 2^31-1(两个正数加得负数,两个负数加得正数)
条件码:eq ge gt le lt al(无条件执行)
equal:等于
not equal:不等
八、cmp比较大小
CMP<c> <Rn>, #<const>
九、B/BL、BX
B<c> <label>
BL<c> <label>
跳转到标签处并存储当前位置到R14(LR)位
BX<c> <Rm>
eg:bx lr //跳转到lr上存储的位置
十、四种系统栈
1.满减栈
2.满赠栈
3.空减栈
4.空增栈
十一、压栈弹栈
stmfd sp!, {lr}
ldmfd sp!, {lr}