ARM中要使用的汇编基础

汇编代码:

复制代码
	preserve8  
	area reset, code, readonly  
	code32  
	entry  
  	; 异常向量表  
	b start                  ; 重置异常,跳转到 start 标签  
	ldr pc, =do_undifined    ; 未定义指令异常处理函数地址  
	ldr pc, =do_swi          ; 软件中断异常处理函数地址  
	ldr pc, =do_p_abort      ; 预取异常处理函数地址  
	ldr pc, =do_d_abort      ; 数据异常处理函数地址  
    nop                      ; 保留异常位(未使用)  
	ldr pc, =do_irq          ; 中断异常处理函数地址  
	ldr pc, =do_fiq          ; 快速中断异常处理函数地址  
	  
 ; 快速中断异常处理函数  
do_fiq  
	b do_fiq                 ; 快速中断处理,进入死循环  

 ; 中断异常处理函数  
do_irq  
	import irq_handler        ; 导入中断服务函数  
	sub lr, lr, #4           ; 将返回地址(lr)减去4,以确保返回到正确的位置  
	stmfd sp!, {r0-r12, lr}  ; 将通用寄存器(r0-r12)和 lr 保持到堆栈中  
	bl irq_handler            ; 调用中断服务函数  
	ldmfd sp!, {r0-r12, pc}^  ; 从堆栈中恢复寄存器并返回,注意恢复到 pc 以返回到中断前的程序  

do_d_abort  
	b do_d_abort             ; 数据异常处理,进入死循环  

do_p_abort  
	b do_p_abort             ; 预取异常处理,进入死循环  

do_swi  
	import swi_handler        ; 导入软件中断服务函数  
	stmfd sp!, {r0-r12, lr}  ; 将通用寄存器(r0-r12)和 lr 压入堆栈  
	bl swi_handler            ; 调用软件中断处理函数  
	ldmfd sp!, {r0-r12, pc}^  ; 从堆栈中恢复寄存器,并返回  

do_undifined  
	b do_undifined           ; 未定义指令异常处理,进入死循环  

start  
	ldr sp, =0x40001000      ; 设置堆栈指针 (sp) 为 0x40001000  

	; 设置为 IRQ 模式  
	mrs r0, cpsr              ; 将 CPSR 值读入 r0  
	bic r0, r0, #0x1F        ; 清除当前模式字段  	;10011-00000
	orr r0, r0, #0x12        ; 将模式设置为 IRQ  	; 10010-10010
	bic r0, #(1 << 7)        ; 启用 IRQ  
	msr cpsr_c, r0           ; 更新 CPSR  

	ldr r0, =0x40001000      ; 加载堆栈基地址  
	sub r0, r0, #1024        ; 设置堆栈指针 (sp),预留 1024 字节  
	mov sp, r0               ; 将堆栈指针 (sp) 设置为新的值  

	; 设置为 USR 模式  
	mrs r0, cpsr              ; 再次读取 CPSR  
	bic r0, r0, #0x1F        ; 清除当前模式字段  
	orr r0, r0, #0x10        ; 将模式设置为 USR  
	msr cpsr_c, r0           ; 更新 CPSR  

	ldr r0, =0x40001000      ; 加载堆栈基地址  
	sub r0, r0, #2048        ; 设置堆栈指针 (sp),预留 2048 字节  
	mov sp, r0               ; 将堆栈指针 (sp) 设置为新的值  
	  
	import main               ; 导入主函数  
	b main                   ; 跳转到主函数执行  

asm_fn  
	export asm_fn  
	swi #7                    ; 调用软件中断,号码为 7  
	bx lr                     ; 返回到调用者  

finished  
	b finished               ; 死循环,等待程序结束  

	end                       ; 汇编结束
  • 本代码使用了多个 ARM 汇编指令,包括:
    • B(Branch):无条件跳转到指定标签。
    • BL(Branch with Link):跳转并链接,将返回地址存储在 LR 中。
    • LDR(Load Register):从内存加载数据到寄存器。
    • STMFD(Store Multiple Full Descending):将多个寄存器的值存储到堆栈中。
    • LDMFD(Load Multiple Full Descending):从堆栈中恢复多个寄存器的值。
    • SUB(Subtract):减法操作。
    • BIC(Bit Clear):清除特定位。
相关推荐
AndyHeee16 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影16 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen16 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
ThornArmor16 天前
【工具篇·番外】跨语言生态的主权回收:基于 ISA 说明书的 4-bit 双向汇编系统全线封顶
c语言·开发语言·汇编·c++·重构·架构
振南的单片机世界16 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人17 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读
暮云星影17 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
是星辰吖~17 天前
WIN32_线程(下)
汇编
m0_5474866617 天前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
Lanceli_van17 天前
SQLite 3.45.2(sqlite-autoconf-3450200)ARM 交叉编译完整步骤
arm开发·sqlite