汇编基础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 高优先级中断(如紧急硬件事件)
相关推荐
切糕师学AI8 小时前
ARM 汇编指令系列文章导读
汇编·arm开发
果粒蹬i9 小时前
从割裂到融合:MATLAB与Python混合编程实战指南
开发语言·汇编·python·matlab
AUVpwoxkW2 天前
关键词:混合储能,VMD,麻雀搜索算法,遗传算法,混合储能容量配置优化,混合储能功率分配
汇编
取个名字太难了a2 天前
x64(一)
汇编
xiaobuding_QAQ3 天前
51汇编仿真proteus8.15学习篇四(附源码)
汇编·单片机·学习·proteus
xiaobuding_QAQ3 天前
51汇编仿真proteus8.15学习篇三(附源码)
汇编·单片机·学习·proteus
188号安全攻城狮4 天前
【PWN】HappyNewYearCTF_2_栈上变量覆写1
linux·运维·汇编·安全·网络安全
草莓熊Lotso4 天前
Linux 进程创建与终止全解析:fork 原理 + 退出机制实战
linux·运维·服务器·开发语言·汇编·c++·人工智能
爱编码的小八嘎5 天前
汇编语言全接触-105.Natas 幽灵王病毒的分析
汇编
老鱼说AI5 天前
深入理解计算机系统1.5:抽象的重要性:操作系统与虚拟机
c语言·开发语言·汇编