一、指令

1、b(Branch)

原型:B<c> <label>

作用:实现无条件跳转,常用于不返回的跳转场景

特点:仅跳转到目标地址,不保存返回地址

示例:b reset         ;跳转到reset标号处执行

2、bl(Branch with Link)

原型: BL<label>

作用:硬件自动将返回地址(PC+4 或 PC+2)存入 LR (带链接的跳转,用于子程序调用,跳转前将返回地址(PC+4)保存到链接寄存器 LR(R14))

特点:子程序执行完毕后可通过 mov pc, lr 或 bx lr 返回调用点

示例:

注意事项:一个嵌套可用,大于两个嵌套以上,需要搭配栈来使用(用法如下)

3、bx lr

原型:BX{<cond>} <Rm>

作用:将程序计数器(PC)设置为链接寄存器(LR/R14)中保存的地址,实现函数返回

特点:BX LR 将 LR 的值加载到 PC,恢复原程序流

示例:

4、stmdb 压栈

原型:STMDB<c><Rn>{!},<registers>

作用:保护现场/恢复现场(压栈/弹栈)

         压栈操作,ARM通常默认采用满递减栈,栈指针先减后存或先读后增

参数:

  • <Rn> 是栈顶指针寄存器,通常为栈指针 SP(R13),指向当前栈顶位置
  • ! 后缀的作用:
    • 不加!:仅按指令操作存储数据,不更新基址寄存器(SP 的值不变)
    • 加! :存储完成后,自动更新基址寄存器(SP = SP - 4*NN 为寄存器数量)
      • 压栈保存寄存器,同时更新栈指针
  • <registers> 的存储规则(入栈出栈的寄存器列表):

    • 存储顺序:寄存器按编号从大到小依次存储(如 R3R2R1R0

    • 内存地址:基址先递减,再存储

使用要点: 栈顶指针寄存器初始化
mov sp, #0x40001000  : 报错非立即数    
ldr sp,    =0x40001000
魔术棒 -> Target->IRAM1:#0x40000000     size:0x1000

示例:

5、ldmfd 弹栈

原型:LDMFD{<cond>} SP!, {<registers>}

作用:恢复现场

        从栈中按低地址到高地址依次加载恢复数据到寄存器,并递增栈指针(弹栈方向与压栈相反)

用法:类似stmdb

示例:同上

6、ldr 普通加载数据

原型:LDR<c> <Rt>, <label>

作用:加载非立即数寄存器中(初始化寄存器 、加载常量数据)

特点:

  • 用于加载 32 位立即数(ARM 指令不能直接加载 32 位立即数,ldr = 是一种伪指令)

示例:

        ldr r0, =0x40001000 ; 将地址 0x40001000 存入 r0

7、ldr 类(*p)操作

原型:

作用:从 内存地址 加载数据到寄存器(类指针操作)

特点:对应的是C语言中的 *p(指针解引用)

示例:

   ---      ldr r0, [r1]                         ; 将 r1 指向的内存数据加载到 r0

   ---      ldr r0, [r1, #4]                   ; r0 = *(r1 + 4)

            ldr r0, [r1, r2]                    ; r0 = *(r1 + r2)

            ldr r0, [r1, r2, LSL #2]       ; r0 = *(r1 + (r2 << 2))

            ldr r0, [r1], #4                    ; r0 = *r1; r1 += 4 (后索引)

            ldr r0, [r1, #4]!                   ; r0 = *(r1 + 4); r1 += 4 (前索引并更新基址)

二、汇编调用C语言

1、流程

(1) 创建main.c

(2) 在main中声明将要在filename.s文件中将要使用的文件 extern void c_add(void);

(3) 导入 import +文件名; (keil当中要求)导出文件文件用export +文件名

(4) 保护现场 bl函数调用 恢复现场

(5) 解决编译报错:

        asm.axf: Error: L6238E: start.o(reset) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to 'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function c_add. asm.axf: Finished: 0 information, 0 warning and 1 error messages.

解决办法:在.s文件开头 写上

                   栈对齐伪指令:preserve8 用于确保函数调用时栈指针保持 8 字节对齐

(6) 创建工程自动添加了启动代码报错

(7)重设软件配置  ---(魔术棒)

  • 魔术棒 -> Debug -> Use Simulator->Run to main(取消)
  • 魔术棒 -> Linker -> Use Memory Layout from Taget Dialog(勾选)
  • 魔术棒 -> Taget -> ROM1 -> Start: 0x0 Size:0x2000

(8)函数传参:基本参数只能传递四个超出部分需采用压栈传递

例:

main.c

start.s

2、 ARM的7种异常类型

异常类型触发条件进入模式优先级
复位(Reset)上电或硬件复位管理模式(SVC)1(最高)
数据中止(Data Abort)非法内存访问(如缺页)中止模式(ABT)2
快速中断(FIQ)高优先级外设中断(如DMA)FIQ模式3
普通中断(IRQ)常规外设中断(如定时器)IRQ模式4
预取中止(Prefetch Abort)指令预取失败中止模式(ABT)5
软件中断(SWI/SVC)SVC 指令触发(系统调用)管理模式(SVC)6
未定义指令执行未知指令未定义模式(UND)7(最低)

3、ARM汇编调用C函数

(1)前4个参数:依次通过寄存器 R0R1R2R3 传递。

(2)超过4个参数:剩余参数按从右向左的顺序压栈(栈内存传递)。

(3)返回值:

        32位整数:通过 R0 返回。

        64位整数:通过 R0(低32位)和 R1(高32位)返回。

        浮点数:通过 S0(单精度)或 D0(双精度)返回

三、ARM 裸机开发环境搭建

        ;标准伪指令

        preserve8                                ;

        area reset, code, readonly

        code32

        entry

        

        ;<1>

        ldr pc, =start_hander                 ; 复位异常(Reset)

        ldr pc, =undefine_hander           ; 未定义指令异常

        ldr pc, =software_hander           ; 软件中断(SWI/SVC)

        ldr pc, =prefetch_hander            ; 预取中止异常

        ldr pc, =data_hander                  ; 数据中止异常

        nop                                              ; 保留位(ARMv5+)

        ldr pc, =irq_hander                      ; 普通中断(IRQ)

        ldr pc, =fiq_hander                      ; 快速中断(FIQ)

undefine_hander

        b undefine_hander
import software_vector

software_hander

        stmfd sp!, {r0-r12, lr}                     ; 保存寄存器现场

        bl software_vector                         ; 调用C函数处理SWI

        ldmfd sp!, {r0-r12, pc}^                  ; 恢复现场并返回(^表示恢复CPSR)

;注意:此处使用^修饰符,表示同时将SPSR恢复到CPSR(用于模式切换)

;默认异常处理均为死循环,实际项目中需替换为具体逻辑

prefetch_hander

        b prefetch_hander                         ; 预取中止死循环

data_hander

        b data_hander                               ; 数据中止死循环

irq_hander

        b irq_hander                                 ; IRQ死循环

fiq_hander

        b fiq_hander                                 ; FIQ死循环

   

;SWI触发函数

       export  asm_swi_fun
asm_swi_fun
swi #7                                            ;触发软件中断(编号7)

       bx lr                                                ;返回调用者

start_hander ;(主开始位置)

        ldr sp, =0x40001000                 ; 设置栈指针初始位置<2>

        import main                               ; 声明外部C入口函数

;切换处理器模式到用户模式(CPSR.M[4:0] = 0x10),并启用中断(清除I-bit)<3>

        mrs r0, cpsr                               ; 读取CPSR

        bic r0, r0, #(0x1F << 0)             ; 清除模式位

        bic r0, r0, #(1 << 7)                   ; 清除中断禁止位(I-bit)

        orr r0, r0, #(0x10 << 0)              ; 设置为用户模式(0x10)

        msr cpsr_c, r0                            ; 写回CPSR

;重新设置用户模式

        ldr sp, =0x40001000                   ; 重新设置栈指针

        sub sp, sp, #1024                       ; 预留栈空间(1KB)

        b main                                        ; 跳转到C的main函数


end

知识点:

1、中断向量表

位置:必须位于0x00000000地址(或可通过VBAR重定位)

组成:8个32位条目,按固定顺序对应不同异常类型

跳转方式

     ldr pc, =handler:支持全地址范围跳转

      b handler:仅支持±32MB范围跳转

2、栈设置:
在进入用户模式前,先设置一次栈(ldr sp, =0x40001000),这是为了在切换模式前确保栈有效(因为不同模式有各自的SP寄存器)
切换到用户模式后,再次设置栈指针并预留空间(sub sp, sp, #1024),避免用户程序栈溢出破坏其他数据

3、ARM处理器中 CPSR(当前程序状态寄存器)的模式位

模式值(十六进制)模式名称英文全称用途说明
0x10用户模式User Mode运行普通应用程序的非特权模式,无法直接访问硬件资源或执行特权指令。
0x11FIQ模式Fast Interrupt Mode处理高速中断(FIQ),有专用的寄存器(R8-R14_fiq),用于低延迟中断响应。
0x12IRQ模式Interrupt Mode处理普通中断(IRQ),比 FIQ 优先级低,用于一般外设中断。
0x13SVC模式Supervisor Mode操作系统内核模式(如 Linux 的 Kernel Mode),用于处理软件中断(SWI/SVC)。
0x17Abort模式Abort Mode当发生内存访问异常(如缺页或权限错误)时进入此模式。
0x1BUndef模式Undefined Mode当执行未定义指令时触发,用于模拟浮点指令或扩展指令集。

特权级别:
特权模式(0x11-0x1B):可以访问所有系统资源和 CPSR 寄存器
非特权模式(0x10):限制访问硬件和关键寄存器

典型应用场景:
用户程序运行在 User Mode(0x10)
操作系统通过 SVC 指令触发 SVC Mode(0x13)执行系统调用
硬件中断自动切换至 IRQ/FIQ Mode(0x12/0x11)

模式切换权限:

        只有特权模式(如 SVC)才能修改 CPSR 的模式位,用户模式尝试修改会触发异常。

模式自动切换:

        中断/异常发生时,处理器会自动切换到对应模式(如 IRQ → 0x12)。

寄存器组差异:

        某些模式(如 FIQ)有专用寄存器(R8-R14_fiq),可加速中断处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98924.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98924.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98924.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清源 SCA 社区版更新(V4.2.0)|漏洞前置感知、精准修复、合规清晰,筑牢软件供应链安全防线!

随着数字化进程加速&#xff0c;软件供应链安全威胁日益复杂&#xff0c;公开漏洞响应滞后、0day 攻击防不胜防、组件升级编译失败、安全与合规风险混杂......这些痛点让企业安全团队、运维人员及研发团队疲于应对。自 2025 年 7 月 1 日安势清源 SCA 社区版首次正式发布以及在…

氚燃料增殖里程碑:MIT新型BABY包层技术实验验证

● 导语 5月20日&#xff0c;麻省理工学院&#xff08;MIT&#xff09;发文称&#xff0c;BABY实验首次获取了氚在装置内增殖的实测数据&#xff0c;验证了核心模型&#xff0c;并为未来核聚变电厂的燃料自循环奠定了重要基础。 原文&#x1f447;&#x1f3fb; https://m…

python+springboot+uniapp微信小程序题库系统 在线答题 题目分类 错题本管理 学习记录查询系统

目录技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xff0…

Office转PDF转换器v1.0.py

软件介绍 这是批量将word、Excel、PPT转换为PDF格式的软件&#xff0c;不过PPT转换为PDF需要电脑安装了office&#xff0c;目前这个我还没有解决没有office也可以安装的方法。 软件使用 软件使用是比较简单的&#xff0c;导入文件/文件夹&#xff0c;在自定义输出路径 点击这…

62_基于深度学习的海洋垃圾检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

深入浅出 全面剖析消息队列(Kafka,RabbitMQ,RocketMQ 等)

消息队列 一、概念 消息队列&#xff08;MQ&#xff09;&#xff1a;一种异步通信机制&#xff0c;通过“消息”的形式让不同系统或模块解耦核心思想&#xff1a;发送方&#xff08;生产者Producer&#xff09;只负责发送消息&#xff0c;接收方&#xff08;消费者Consumer&…

Flux Images Generation API 对接说明

本文将介绍一种 Flux Images Generation API 对接说明&#xff0c;它是可以通过输入自定义参数来生成Flux官方的图片。 接下来介绍下 Flux Images Generation API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 Flux Images Generation API 对应页面申请对应的服务…

CSS布局 - 网格布局 -- 笔记3

目录网格布局基础网格网格剖析CSS 提供了一些控制网页布局的几个重要工具&#xff0c;这里介绍网格布局。 网格布局 CSS 网格可以定义由行和列组成的二维布局&#xff0c;然后将元素放置到网格中。有些元素可能只占据网格的一个单元&#xff0c;另一些元素则可能占据多行或多…

合约开发完后部署测试

一 编译npx hardhat compile二 测试npx hardhat test三部署注意部署的时候2.0和3版本有所区别&#xff0c;3.0如下# 部署到本地网络&#xff08;如已运行 npx hardhat node&#xff09; npx hardhat ignition deploy ./ignition/modules/MyModule.ts --network localhost# 部署…

产品无法正确解析复杂表格和流程图,有什么替代方案或优化方法?

在真实办公场景中&#xff0c;文档内的元素往往不具备标准化和格式化特征&#xff0c;像双栏表格、无线图表等复杂元素十分常见。而传统 OCR 工具在面对这类复杂文档时&#xff0c;存在明显的能力短板&#xff1a;它无法准确判断复杂表格的结构逻辑以及内容的顺序逻辑&#xff…

《Html模板》HTML数学题目生成器 - 让数学练习更简单(附源码)

目录专栏导读&#x1f9ee; HTML数学题目生成器 - 让数学练习更简单项目简介✨ 核心功能&#x1f3af; 灵活的运算类型选择&#x1f4ca; 智能题目生成算法⚙️ 个性化参数设置&#x1f5a8;️ 专业打印优化&#x1f3a8; 用户体验设计现代化界面交互体验&#x1f6e0;️ 技术实…

Go语言设计模式(七)组合模式

组合模式是指将一组相似对象当做一个单一对象的设计模式.1.组成角色:1.1组件:组合中的对象声明接口,主要用于访问和管理其子组件.1.2叶子节点:定义组合中原始对象行为的类.叶子节点表示组合中的叶对象.1.3组合:又称为容器,存储子组件并在组件接口中实现与子组件有关的类.1.4客户…

AI 3D 生成工具知识库:当前产品格局与测评总结

聚焦于 AI 3D 生成领域的领军产品、功能比较及实测性能。内容分为产品格局、通用功能、测评系统与基准测试&#xff0c;以及单视图生成实测结果。所有信息基于脚本分析&#xff0c;并交叉验证了产品名称、团队背景&#xff08;如 VAST AI 的 TripoSR/Meshy 的 Meshy-1、影眸科技…

淘客app的容器化部署与编排:基于Kubernetes的微服务架构实践

淘客app的容器化部署与编排&#xff1a;基于Kubernetes的微服务架构实践 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在淘客app的业务迭代中&#xff0c;传统物理机部署面…

当GitHub不再纯粹:Python自动化测试的未来是AI还是危机?

全球最大的开源代码平台&#xff0c;彻底被卷进了AI洪流&#xff01;作为全球最大的“程序员交友平台”&#xff08;手动狗头&#xff09;&#xff0c;GitHub 可以说是每一个开发者又爱又恨的“家”。没错&#xff0c;就是那个全球最大、没有之一的开源代码托管平台&#xff01…

Spring Boot + MySQL 创建超级管理员

Spring Boot系统创建超管实现方式1. 数据库脚本初始化&#xff08;最直接的方式&#xff09;2. Spring Boot 启动时自动创建&#xff08;代码级初始化&#xff09;2.1 实体类定义2.2 Repository 接口2.3 初始化组件2.4 配置密码加密器3. 通过接口手动创建&#xff08;最安全的方…

杨辉三角**

一、题目给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。示例 1:输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows 1 输出: [[1]]提示:1 <…

Vue3 的单文件组件(.vue 文件)中,在 <script>、<template>、<style> 标签外输入内容不会导致程序报错

在 <script>、<template>、<style> 标签外首行误输入内容 vtsvts <script setup lang"ts" name"BaseDocxPreviewDialog"> /*** docx文件预览模态框组件*/ defineOptions({ name: "BaseDocxPreviewDialog" }); import { …

LVS负载均衡群集和LVS+Keepalived群集

1、群集 1.1群集的含义 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#xff0c;相当于一台大型计算机。 1.2 企业群集分类 负载均衡群集&#xff1a;提高应用系统的响应能力、尽可能处理更多的…

LeetCode力扣-hot100系列(5)

这一篇主要讲一讲回溯&#xff0c;除了N皇后问题是困难题&#xff0c;不过N皇后知道了咋做也不难。回溯整体上还是好做的&#xff0c;直到套路容易做出来&#xff0c;题目容易理解。回溯[1]全排列问&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的…