自学嵌入式第四十四天:汇编

一、目的

初始化硬件,引导启动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}

相关推荐
我在人间贩卖青春5 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春5 天前
汇编之伪操作
汇编·伪操作
济6175 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka5 天前
汇编TEST指令
汇编
我在人间贩卖青春5 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春5 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka6 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子6 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka6 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春7 天前
汇编之分支跳转指令
汇编·arm·分支跳转