1.函数调用
fun0mov r4, #100bx lrget_MaxNumcmp r0, r1stmfd sp!, {r0-r12, lr} //入栈bl fun0 //调用fun0函数ldmfd sp!, {r0-r12, lr} //出栈movge r3, r0movlt r3, r1bx lr mainldr sp, =0x40001000mov r0, #100mov r1, #200mov r2, #100stmfd sp!, {r0-r12, lr}bl get_MaxNum ldmfd sp!, {r0-r12, lr}
2.指针
c语言: unsigned int *p汇编: ldr r1, =0x40000fff //给的地址 ldr r3,=0x11223344 //给的值str r3, [r1] //将r3存储到r1里面 ldr r0, [r1] //将r1指向的值给到r0
3.调用.c文件函数
.c文件: extern int fun(int a, int b) {return a+b; }.s文件ldr sp, =0x40001000import fun //添加函数stmdf sp!, {r0-r12, lr}mov r0, #10 ;参数a = 10mov r1, #20 ;参数b = 20mov r2, #30 bl fun //调用函数ldmdf sp!, {r0-r12, lr}
注意:
1.a和b的参数取决于r0和r1,而与r2没关系,若是给多个寄存器赋值,也只会按顺序传入参数
2.若是传入的参数大于四个就得进行压栈
.c文件: extern int fun(int a, int b, int c, int d, int e) {return a+b+c+d+e; }.s文件ldr sp, =0x40001000import fun //添加函数stmdf sp!, {r0-r12, lr}mov r0, #10 ;参数a = 10mov r1, #20 ;参数b = 20mov r2, #30mov r3, #40mov r4, #50stmdf sp!, {r4} bl fun //调用函数ldmdf sp!, {r4}ldmdf sp!, {r0-r12, lr}
4.arm启动代码
preserve8area reset, code, readonlycode32entryldr pc, =start_handerldr pc, =undefine_handerldr pc, =software_handerldr pc, =prefetch_handerldr pc, =data_handernopldr pc, =irq_handerldr pc, =fiq_hander //ARM 架构的异常向量表实现undefine_handerb undefine_handerimport software_vector //添加.c文件里面的software_vector函数 software_handerstmfd sp!, {r0-r12, lr}bl software_vector //调用.c文件里面的software_vector函数ldmfd sp!, {r0-r12, lr}bx lrprefetch_handerb prefetch_handerdata_handerb data_handerirq_handerb irq_handerfiq_handerb fiq_handerexport asm_swi_fun asm_swi_funswi #7 //软件中断 立即数执行对应服务bx lrstart_hander //上电或者复位的处理函数ldr sp, =0x40001000 //初始化spimport main //添加.c文件的main函数msr r0, cpsr //读取当前程序状态寄存器(CPSR)到 R0bic r0, r0, #(0x1f << 0)//清除 CPSR 的“模式位”(低 5 位,0x1f = 0b11111)bic r0, r0, #(1 << 7) //清除 CPSR 的“中断禁止位 I”(第 7 位),允许 IRQ 中断orr r0, r0, #(0x10 << 0)//设置“模式位”为 User 模式(0x10 = 0b10000,对应 User 模式)msr cpsr_c, r0 //将修改后的 R0 写入 CPSR 的“控制位域”(cpsr_c 表示只更新控制位)ldr sp, =0x40001000sub sp, sp, #1024b mainend
4.1 ARM的异常向量表
异常向量地址 异常类型 代码中的处理函数 作用 0x00000000 复位异常(Reset) start_hander
系统上电 / 复位时执行,初始化硬件 0x00000004 未定义指令异常 undefine_hander
执行无效指令时触发(如未实现指令) 0x00000008 软件中断(SWI) software_hander
触发 SWI 时跳转到系统调用处理 0x0000000C 预取指异常 prefetch_hander
指令预取失败(如地址无效) 0x00000010 数据访问异常 data_hander
数据读写失败(如越界、无权限) 0x00000014 保留(Reserved) nop
(空指令)ARM 架构预留,暂不使用 0x00000018 外部中断(IRQ) irq_hander
外部硬件触发中断(如按键、定时器) 0x0000001C 快速中断(FIQ) fiq_hander
高优先级中断(如紧急硬件事件)