当前位置: 首页 > news >正文

ARM汇编 启动代码

1.目的

arm汇编的主要目的是为了编写arm启动代码,启动代码启动以后,引导程序到c语言环境下运行。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。因此启动代码的主要任务有:
1、初始化异常向量表
2、初始化各工作模式栈指针寄存器
3、开启arm内核中断允许
4、将工作模式设置为user模式
5、完成上述工作后,引导程序进入c语言主函数执行

2.初始化异常向量表

    preserve8area reset, code, readonlycode32entryldr pc, =start_handlerldr pc, =undefine_handlerldr pc, =software_handlerldr pc, =prefetch_handlerldr pc, =data_handlernopldr pc, =irq_handlerldr pc, =fiq_handlerundefine_handlerb undefine_handlersoftware_handlerimport software_vectorstmfd sp!, {r0-r12, lr}		 ;压栈bl software_vectorldmfd sp!, {r0-r12, pc}^     ;出栈,加^代表自动变换为原来的模式;bx lrprefetch_handlerb prefetch_handlerdata_handlerb data_handlerirq_handlerb irq_handlerfiq_handlerb fiq_handlerexport asm_swi_fun
asm_swi_funsvc #7bx lrstart_handlerldr sp, =0x40001000		     ;设置栈底位置,注意为满减栈import mainmrs r0, cpsr				 ;从cpsr寄存器中读取值放到r0中bic r0, r0, #(0x1f<<0)		 ;先让低5位清0bic r0, r0, #(1<<7)		     ;打开中断orr r0, r0, #(0x10<<0)		 ;改变模式为user模式,即10000,故让bit4值1msr cpsr_c, r0				 ;将r0中的值写入到cpsr寄存器中ldr sp, =0x40001000sub sp, sp, #1024			 ;重新设置栈底位置,减去1k大小即1024个字节b main						 ;进入c语言的main函数中end

ldr pc程序计数器,使得各异常程序有了对应的地址

异常向量表:内核为每种异常在固定地址(向量表)中存放处理程序入口,发生异常时自动跳转到对应地址执行

3.初始化栈指针寄存器

由于ARM内核时满减栈,且所用板子为2440,IRAM起始地址为0x40000000,大小为0x1000,即4096个字节(4k大小),且为满减栈,故栈底设置为0x40001000,当要压栈时,栈针先自加后再赋值

4.相关指令

1.mrs

在 ARM 架构指令集中,MRS(Move from Special Register) 是一条用于读取特殊寄存器(Special Register)内容到通用寄存器的指令。它是访问 ARM 处理器特殊寄存器的关键指令,常用于获取处理器状态、配置信息等。

MRS <通用寄存器>, <特殊寄存器>

  • 功能:将<特殊寄存器>的内容复制到<通用寄存器>中。
  • 特殊寄存器:cpsr当前程序状态寄存器,spsr:备份程序状态寄存器
MRS r0, CPSR  ; 将当前程序状态寄存器(CPSR)的值读取到r0

2.msr

在 ARM 架构指令集中,MSR(Move to Special Register) 是与 MRS 指令对应的指令,用于将通用寄存器中的数据写入到特殊寄存器(Special Register)中。它主要用于修改处理器状态、配置系统控制参数等底层操作

MSR <特殊寄存器>{<字段>}, <通用寄存器>

功能:将<通用寄存器>的内容写入<特殊寄存器>的指定<字段>(若不指定字段,则写入整个寄存器)

MRS r0, CPSR        ; 先通过MRS读取CPSR到r0
ORR r0, r0, #0x80   ; 置位I位(bit7):0x80 = 10000000b
MSR CPSR_c, r0      ; 将修改后的控制字段写回CPSR

3.stmfd

STMFD <Rn>{!}, <寄存器列表>
  • 功能:按照 “满递减栈(Full Descending Stack)” 的方式,将寄存器列表中的多个寄存器值依次存储到内存中。
  • 参数说明
    • <Rn>:基址寄存器,通常为栈指针 spr13),表示栈的当前位置。
    • !:可选的写回标志,若添加则指令执行后会自动更新基址寄存器的值(将最终地址写回 <Rn>)。
    • <寄存器列表>:用大括号 {} 包含的寄存器集合(如 r0-r3, lr),表示需要存储的寄存器。

4.ldmfd

STMFD 通常与 LDMFD(批量加载指令)配对使用:

  • STMFD sp!, {reg_list}:压栈(保存寄存器)
  • LDMFD sp!, {reg_list}:出栈(恢复寄存器)

这种配对确保了栈操作的对称性,是 ARM 汇编中函数调用、异常处理的标准模式。

STMFD sp!, {r4-r7, lr}  ; 保存非volatile寄存器和返回地址; 函数体操作...LDMFD sp!, {r4-r7, pc}  ; 恢复寄存器并返回(用pc代替lr实现跳转)

可用在函数调用或者中断处理


文章转载自:

http://yFrO2WrL.xbyyd.cn
http://waEuZhzr.xbyyd.cn
http://BRcBkAZW.xbyyd.cn
http://ElWtJumR.xbyyd.cn
http://n8X9Obhv.xbyyd.cn
http://hNjApL7R.xbyyd.cn
http://SLs7I0Gn.xbyyd.cn
http://Pm7jdhIb.xbyyd.cn
http://IMPVvx4r.xbyyd.cn
http://b8Us68vu.xbyyd.cn
http://KlSGyXBc.xbyyd.cn
http://HumrmrKJ.xbyyd.cn
http://9z42N1vD.xbyyd.cn
http://Ra4vaPec.xbyyd.cn
http://FYhvKGSQ.xbyyd.cn
http://VUNb6ant.xbyyd.cn
http://RJjHrXyL.xbyyd.cn
http://ff8vSK4p.xbyyd.cn
http://lRdg5fe8.xbyyd.cn
http://pgjpdNIG.xbyyd.cn
http://iOQOPOA9.xbyyd.cn
http://kxCHoaEY.xbyyd.cn
http://dZtYg8Wb.xbyyd.cn
http://2ZSKCaPH.xbyyd.cn
http://9yxb2nbm.xbyyd.cn
http://GoItS0YD.xbyyd.cn
http://uOdJDzuP.xbyyd.cn
http://cywS1GHJ.xbyyd.cn
http://HEThHQNR.xbyyd.cn
http://PnMDqLpo.xbyyd.cn
http://www.dtcms.com/a/375606.html

相关文章:

  • ctfshow - web入门 - JAVA
  • 无法加载 DLL“xxxxxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
  • 在Mybatis plus中如何使用自定义Sql
  • MyBatis操作数据库——入门
  • AI编程:[实践]PDTAC通过叠加多种设计模式,实现高可扩展的第三方系统对接
  • 操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:蓝牙
  • 小目标检测:FFCA-YOLO详解
  • Gemini 2.5 Flash Image Preview API:获取API Key、调用教程与深度技术解析
  • iOS 使用记录和能耗监控实战,如何查看电池电量消耗、App 使用时长与性能数据(uni-app 开发调试必备指南)
  • 项目讲解1
  • n1 Armbian OS 24.11.0 noble 安装suricata
  • 【算法--链表】114.二叉树展开为链表--通俗讲解
  • IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南
  • IDEA2024.1使用Debug调试工具F8步过失效解决方法
  • Java 大视界 -- Java 大数据在智能交通智能公交系统优化与乘客出行服务提升中的应用(409)
  • Java数据结构——树
  • vue3和vue2生命周期的区别
  • 《棒球小白》棒球球落地了才能跑垒吗·棒球1号位
  • 排序算法(Java)
  • Oracle数据库
  • 腾讯开源智能体框架Youtu-agent全解析:特性、架构与实战指南
  • 【2511系统分析师备考-快速阅读一】
  • Vue 学习随笔系列二十五 -- 多文件上传并支持修改
  • 从0到1学习Vue框架Day03
  • 【Redis五种数据类型】
  • Redis 双向同步如何避免循环?【附实操演示】
  • Redis单线程模型为什么快?
  • At least one <template> or <script> is required in a single file component
  • 不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
  • 动态控制rabbitmq中的消费者监听的启动和停止