汇编基础,LINUX启动文件吧。。
【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0-尝鲜版第七章
目录
一,伪操作(定义变量)
.byte 定义单字节数据
.short定义双字节数据
.long定义四字节数据
.equ赋值语句
如:.equ num,0x12 //num=0x12
.alingn数据字节对齐
.end表示源文件结束
.golbal定义一个全局符号(全局变量)
二,函数
/* 未定义中断 */
Undefined_Handler:
ldr r0, =Undefined_Handler
bx r0
“Undefined_Handler”就是函数名,
“ldr r0, =Undefined_Handler”是函数体,
“bx r0”是函数返回语句,函数返回语句不是必须的。
三,指令
3.1处理器内部数据传输指令(就是a=b;)
- MOV 指令(复制)
MOV R0,R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1
MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12 - MRS 指令(特殊寄存器复制)
MRS R0, CPSR @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR - MSR 指令(特殊寄存器复制进)
MSR CPSR, R0 @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0
3.2存储器访问指令
(ARM 不能直接访问存储器,比如 RAM 中的数据,I.MX6UL 中的寄存器就是 RAM 类型的)
- LDR 指令(从存储器读数据)
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中 - STR 指令(存储器写数据)
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002
STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中
3.3压栈和出栈指令
(A 函数中调用 B 函数,当 B 函数执行完以后再回到 A 函数继续执行,进入B时压栈A)
- 压栈
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈 - 出栈
POP {R0~R3,R12} @在恢复 R0~R3,R12
3.4跳转指令(跳转函数)
- B 指令(要调用的函数不会再返回到原来的执行处,那就可以用 B 指令)
b main @跳转到 main 函数 - BL 指令(调用子函数,跳了还回来)
bl system_irqhandler @加载 C 语言中断处理函数到 。。 寄存器中