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

arm启动代码总结

一、指令概括

        1.ldr:加载内容到寄存器        ldr sp, =0x40001000(将地址加载入sp寄存器中)

        2.b:跳转到对应标志地方        bx lr:将lr寄存器保存的地址返回到pc中        bl:跳转前将pc地址保存在lr寄存器中

        3.stmfd sp!,{r0-r12,lr}        :压栈,将{}里面内容压入栈中保存

           ldmfd sp!,{r0-r12,lr}        :弹栈,将栈里面保存的{}里面的内容返回

          ldmfd sp!,{r0-r12,pc}^      :^自动切换回User模式,将lr地址直接返回到pc中

        4.import        :c文件中的函数在汇编文件调用时使用

           export        :汇编文件中的函数在c文件调用时使用

        5.swi #7        :软中断产生直接跳到初始化的软中断向量处

        6.mrs  r0,  cpsr        :将系统状态寄存器写入通用寄存器(用于修改模式)

           msr  cpsr_c,  r0

        7.bic  r0,  r0,  #(0x1F << 0)        :清零低五位

           orr  r0,  r0,  #(0x10 << 0)        :第五位置1

        8.sub、add        :加减法

        9.mov        :寄存器赋值

        10.ge:greater equal          lt :小于        cmp:比较 

        11.str r1, [r0], #4    :*p++    都是单目运算自右结合,后置++先用再偏移    (这里是地址偏移),值存储在0x40000000中,r0指向了0x40000004
str r1, [r0, #4]            :先偏移在0x40000004,值存在0x40000004中

二、伪指令执行完,异常处理向量必须按序写,因为每一个地址都是固定的

三、arm汇编用c语言函数以及c语言函数调用汇编编写的函数,函数的参数和返回值如何处理?

        1.汇编调用c语言:①import+函数名:导入要调用的函数        ②如果参数小于5个值,汇编中使用mov r0, #10形式赋值,返回值默认存储在r0寄存器内        ③如果参数大于4个值,第5个值及后面的值需要压栈和弹栈        ④c语言中正常写此函数

        2.c语言调汇编:①export+函数名:汇编中要导出的函数        ②c语言中函数直接传参        ③返回值通过mov可将存有结果值得通用寄存器赋值给r0寄存器,通过r0寄存器返回

四、aem内核中有几种异常分别是什么,会时内核切换到那种工作模式?

        1.复位(Reset):系统上电或者硬件复位时,内核进入特权模式(Supervisor)

        2.未定义指令(Undefined Instruction):执行无效指令时触发,内核进入未定义模式(Undefined)

        3.软件中的(SWI/SVC):通过软件指令(svc/swi)主动触发,内核进入特权模式

        4.预取中止(Prefetch Abort):指令预取失败时触发,内核进入中止模式(Abort)

        5.数据中止(Data Abort):数据访问失败时触发,内核进入中止模式(Abort )    

        6.外部中断(IRQ):普通硬件中断触发,内核进入中断模式(IRQ)

        7.快速中断(FIQ):高优先级硬件中断触发,内核进入快速中断模式(FIQ)

五、内核切换模式步骤

六、状态寄存器

(一)条件位:28-31位

        1.N:运算结果正负标志

        2.Z:运算结果是否为0

        3.C:是否有进位或者借位标志

        4.V:运算结果是否溢出标志

(二)Mode位:0-4

(三)细节图

七、ARM使用环境配置

(一)Windows系统使用vs code写代码

(二)Ubuntu下交叉编译

(三)编译器使用:Linaro GCC 4.9-2017.01


文章转载自:

http://dI5HxP3o.stfdh.cn
http://sQvjrUoa.stfdh.cn
http://jCIHMopH.stfdh.cn
http://aV8K2RTI.stfdh.cn
http://ec8OmikD.stfdh.cn
http://xHcKiG9S.stfdh.cn
http://XHiibpq2.stfdh.cn
http://F0Tqi8tY.stfdh.cn
http://UkywD1dH.stfdh.cn
http://vunBQm4Y.stfdh.cn
http://th4mUb0O.stfdh.cn
http://l51JPJvr.stfdh.cn
http://mh3A0dPU.stfdh.cn
http://TWJOLxmk.stfdh.cn
http://N1WBMz2H.stfdh.cn
http://jHjZjtMy.stfdh.cn
http://7A1gkyEd.stfdh.cn
http://2NV4XCFe.stfdh.cn
http://OR3eyyJv.stfdh.cn
http://NJvTAXk4.stfdh.cn
http://aPaR2lQD.stfdh.cn
http://Q6qccRU1.stfdh.cn
http://NqG4G9Ql.stfdh.cn
http://CuwveawI.stfdh.cn
http://gAEZbaAR.stfdh.cn
http://JNZMURXx.stfdh.cn
http://lQ4eNY5l.stfdh.cn
http://MKuyY3oP.stfdh.cn
http://efIw92Lv.stfdh.cn
http://27VOmwpr.stfdh.cn
http://www.dtcms.com/a/374704.html

相关文章:

  • TypeScript学习【一】
  • Day 19: 算法基础与面试理论精通 - 从思想理解到策略掌握的完整体系
  • 基于CNN的航空发动机剩余寿命预测 (MATLAB实现)
  • 已知 inode 号,如何操作文件?Ext 文件系统增删查改底层逻辑拆解
  • 论文阅读,Plug-and-Play Latent Diffusion,Brain Imaging
  • C#(/unity)中的闭包
  • 概率论第六讲—数理统计
  • Oracle RAC共享存储核心技术
  • C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
  • 全网首发!Realsense 全新 D555 相机开箱记录与 D435i、L515、D456 横向测评!
  • 基于 Django 与 Bootstrap 构建的现代化设备管理平台
  • 图像金字塔---图像上采样下采样
  • 【ARM】ULINK Pro如何和SWD接口进行连接调试
  • 使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵
  • 苹果用户速更新!macOS存严重漏洞,用户隐私数据面临泄露风险
  • 认识CPU (六):缓存与内存——芯片里的多级智能仓库
  • C++设计模式原理与实战(视频教程)
  • 苍穹外卖项目实战(day7-1)-缓存菜品和缓存套餐功能-记录实战教程、问题的解决方法以及完整代码
  • 51.不可变基础设施:云原生时代的「乐高城堡」建造法
  • Redis小白入门
  • 分层-三层架构
  • 实战:HarmonyOS 中 HEIF 图像开发全流程(图处理篇)
  • 深入 Kubernetes:从零到生产的工程实践与原理洞察
  • 在Ubuntu上修改Nginx的默认端口(例如从80端口改为其他端口,如8080)
  • 《用 Pandas 和 Matplotlib 绘制柱状图:从数据读取到可视化表达的实战指南》
  • python之socket网络编程
  • 【用与非门设计一个七段显示译码器,要求显示Y, E, S 三个符号+门电路符号逻辑式】2022-12-5
  • 解决 Ubuntu 25.04 下 make menuconfig 报 ncurses 错误的问题
  • (49)es容器化部署启动报错-RBAC权限问题
  • MacOS 运行CosyVoice