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

一、目的

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

相关推荐
是星辰吖~1 小时前
X86反汇编:透视之眼_反编译特训(1-2)
汇编
是星辰吖~8 小时前
X86反汇编:破茧成蝶 —— 赤裸逻辑与机械之心(1-1)
汇编
逆向命运11 小时前
PC企微搜索手机号窗口绕过
c语言·汇编·c++·飞书·企业微信
是星辰吖~1 天前
函数战争:内存领地的争夺与撤退
汇编
止观止1 天前
在 WSL2 上从零搭建 ARM 混合编程环境
汇编·arm开发·嵌入式开发·混合编程
say_fall2 天前
8086汇编程序设计_从基础到实战
开发语言·汇编·8086
浩浩测试一下3 天前
LoadPE &&& 原理以及作用 (ASM汇编版本)>>01
汇编·免杀·pe结构·windows编程·二进制逆向·系统loadpe
ThornArmor3 天前
【控制篇】斩断无休止空转:4-bit 指令集里的跳转律令与时序状态机
c语言·汇编·c++·单片机·嵌入式硬件
大阳1233 天前
ARM4.(通过汇编,c语言,固件库点亮LED)
c语言·开发语言·汇编
iCxhust3 天前
8086 汇编 TINY 和 SMALL 编程MODEL区别
汇编·单片机·嵌入式硬件·操作系统·微机原理·8088单板机