汇编基础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 高优先级中断(如紧急硬件事件)
相关推荐
浩浩测试一下16 小时前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰18 小时前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编
浩浩测试一下1 天前
汇编 汇编寻址 (逆向分析)
汇编·寻址·windows编程·二进制逆向·机器码
浩浩测试一下2 天前
汇编 位运算 (逆向分析)
汇编·逆向·位运算·asm·windows编程·二进制逆向
浩浩测试一下2 天前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程
a83331962 天前
C语言嵌入汇编详解
汇编·单片机·语言
yoyo_zzm3 天前
汇编到PHP:五大编程语言核心特性全解析
开发语言·汇编·php
ComputerInBook5 天前
X64 汇编 MOVSD 的两种用法
汇编·汇编指令·movsd
YangWeiminPHD6 天前
金水32051编译器下的AI8051U单片机入门:从点亮LED到“你好,世界,我来了!”
c语言·汇编·51单片机·编译器
九思十安8 天前
HNU2026-计算机系统-笔记 5 汇编进阶
汇编·笔记