汇编基础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 高优先级中断(如紧急硬件事件)
相关推荐
GHL2842710908 小时前
i++汇编学习
汇编·学习
iCxhust12 小时前
Intel8259汇编串口接收转C语言
c语言·开发语言·汇编
东亚_劲夫14 小时前
汇编和反汇编
汇编
无名J0kзr4 天前
汇编:语法速通
汇编
月盈缺8 天前
学习嵌入式的第三十九天——ARM——汇编
汇编·arm开发·学习
7hhhhhhh9 天前
自学嵌入式第四十四天:汇编
汇编
出门吃三碗饭9 天前
编译器构造:从零手写汇编与反汇编程序(二)
汇编·人工智能·机器学习
JCBP_17 天前
QT(4)
开发语言·汇编·c++·qt·算法
sheepwjl18 天前
《嵌入式硬件(十二):基于IMX6ULL的时钟操作》
汇编·arm开发·单片机·嵌入式硬件·时钟·.s编译
DebugKitty19 天前
硬件开发2-ARM裸机开发1-I.MX6ULL - 汇编点灯
汇编·makefile·imax6ull·gpio·电路复用