汇编基础2

1.函数调用

css 复制代码
fun0
	mov r4, #100
	bx lr

get_MaxNum
	cmp r0, r1
	stmfd sp!, {r0-r12, lr}    //入栈
	bl fun0                    //调用fun0函数
	ldmfd sp!, {r0-r12, lr}    //出栈
	movge r3, r0
	movlt r3, r1
	bx lr
main
	ldr sp, =0x40001000

	mov r0, #100
	mov r1, #200
	mov r2, #100
	stmfd sp!, {r0-r12, lr}
	bl get_MaxNum	
	ldmfd sp!, {r0-r12, lr}

2.指针

css 复制代码
c语言:
unsigned int *p

汇编:
ldr r1, =0x40000fff //给的地址
ldr r3,=0x11223344 //给的值

str r3, [r1]    //将r3存储到r1里面
ldr r0, [r1]    //将r1指向的值给到r0

3.调用.c文件函数

cs 复制代码
.c文件:
extern int fun(int a, int b)
{
    return a+b;
}

.s文件

    ldr sp, =0x40001000
    import fun            //添加函数

    stmdf sp!, {r0-r12, lr}
    mov r0, #10            ;参数a = 10
    mov r1, #20            ;参数b = 20
    mov r2, #30            
    bl fun                //调用函数
    ldmdf sp!, {r0-r12, lr}

注意:

1.a和b的参数取决于r0和r1,而与r2没关系,若是给多个寄存器赋值,也只会按顺序传入参数

2.若是传入的参数大于四个就得进行压栈

cs 复制代码
.c文件:
extern int fun(int a, int b, int c, int d, int e)
{
    return a+b+c+d+e;
}

.s文件

    ldr sp, =0x40001000
    import fun            //添加函数

    stmdf sp!, {r0-r12, lr}
    mov r0, #10            ;参数a = 10
    mov r1, #20            ;参数b = 20
    mov r2, #30
    mov r3, #40
    mov r4, #50
    stmdf sp!, {r4}            
    bl fun                //调用函数
    ldmdf sp!, {r4}
    ldmdf sp!, {r0-r12, lr}

4.arm启动代码

cs 复制代码
	preserve8
	area reset, code, readonly
	code32
	entry

	ldr pc, =start_hander
	ldr pc, =undefine_hander
	ldr pc, =software_hander
	ldr pc, =prefetch_hander
	ldr pc, =data_hander
	nop
	ldr pc, =irq_hander
	ldr pc, =fiq_hander        //ARM 架构的异常向量表实现

undefine_hander
	b undefine_hander

	import software_vector    //添加.c文件里面的software_vector函数
software_hander
	stmfd sp!, {r0-r12, lr}
	bl software_vector        //调用.c文件里面的software_vector函数
	ldmfd sp!, {r0-r12, lr}
	bx lr

prefetch_hander
	b prefetch_hander

data_hander
	b data_hander

irq_hander
	b irq_hander

fiq_hander
	b fiq_hander

	export asm_swi_fun
asm_swi_fun
	swi #7    //软件中断  立即数执行对应服务
	bx lr

start_hander                //上电或者复位的处理函数
	ldr sp, =0x40001000     //初始化sp
	import main             //添加.c文件的main函数
	msr r0, cpsr            //读取当前程序状态寄存器(CPSR)到 R0
	bic 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, =0x40001000
	sub sp, sp, #1024

	b main

	end

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