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

ARM -- 汇编语言

一、ARM 

1、ARM概述

  • ARM 是基于精简指令集的处理器架构(RISC),主要运用于移动设备和嵌入式系统
    • CISC:复杂指令集,如Windows x86,功能强大,指令复杂,功耗高
    • RISC:精简指令集,高功耗、高性能、低成本

2、ARM工作模式概述

工作模式简介
用户模式

正常程序执行模式,权限最低

系统模式

特权模式之一,常用作操作系统内核操作

运行操作系统内核任务,与用户模式共用寄存器

中断模式

处理普通中断请求

用于通用外设中断响应

快速中断模式(FIQ)

优先级高于普通中断,具有独立寄存器

适用于低延迟中断处理,如高速数据传输

管理模式(SCV)

操作系统保护模式,系统复位或执行软中断指令时进入

用于系统调用和特权管理

终止模式(ABT)当发生非法内存访问或数据错误时触发
未定义指令模式(UND)遇到无法识别的指令时进入

3、异常向量表

  1.概述
  • 异常向量表是ARM处理器中一组固定的内存地址,每个地址对应一种异常类型。当异常发生时,处理器会自动跳转到对应的地址执行异常处理程序
  • 在启动代码中,异常向量表通常通过汇编指令定义
  2.异常处理流程
  • 异常触发后,处理器保存当前状态,跳转到对应向量地址执行处理程序
  • 处理完成后恢复现场,继续原程序执行
  3.七种异常类型
类型发生场景
Reset系统复位时触发
Undefined Instruction执行未知指令时触发
IRQ普通中断请求
FIQ快速中断请求
Data Abort数据访问失败
Prefetch Abort指令预取失败
Software Interrupt (SWI)软中断指令调用

二、汇编语言

1、概述

  • 概念:汇编语言是一种面向机器的低级编程语言
  • 特点:
    • 硬件依赖:不同处理器需使用不同的汇编语言
    • 实施高效:直接操作寄存器、内存和I/O端口,生成代码紧凑且执行速度快
    • 代码复杂:需手动管理内存和寄存器,代码冗长且调试困难
  • 应用领域:嵌入式系统、操作系统与驱动
  • 伪操作:写给编译器命令,用于指导编译器如何工作、不是ARM处理器实际的指令
  • 立即数:直接嵌入指令中的常数值,用于对寄存器或内存单元赋初值
    • 合法立即数编码规则
      • 低 8 位存储基数值(0–255),高 4位存储右移位数
      • 32位操作数中至少有20位连续为0

2、格式(均为伪操作)

  • area:用于定义一个段,程序、数据、堆栈等都需要被组织在不同的段中
  • reset:定义字段的名字
  • code:指定该段属性的伪代码、意味着字段可执行的指令
  • readonly:指定权限为只读
  • code32:表示后续指令使用 32位的 ARM 指令集
  • thumb: 表示后续指令使用 16位的 Thumb 指令集

    area reset, code, readonly
code32
entry      ;起点

end        ;终点

3、部分指令概述(详细信息可查询相关手册)

   1.mov、mvn(寄存器、内存间数据传输指令)

        mvn 在 mov 的基础上先按位取反,其余相同,下面以 mov 为例

原型:

        1.MOV{S}<c> <Rd>, #<const>

        2.MOV{S} <Rd>, <Rm>, <way>#<n> 

功能:

        1.将立即数加载到指定寄存器中

        2.将寄存器<Rm>的值按<way>操作n位后,存入目标寄存器<Rd>中

参数:

        {S}(可选):用于指定是否更新APSR中的标志位

        <c>(可选):控制指令在特定条件下执行

        <Rd>:目标寄存器

       <Rm>:源寄存器 

        #<const>、#<n> :立即数

        <way>:数据操作方式

                ASR:算数右移

                LSL:逻辑左移

                LSR:逻辑右移

                ROR:循环右移   

   2.算数运算指令add(加)、sub(减)

        以加法为例、减法只需修改指令名、其余不变

原型:

        1.add{S}<c> <Rd>, <Rn>, #<const>

        2.ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

功能:

        1.将<Rn>寄存器中数据加立即数后的结果存放到<Rd>寄存器中

        2. 将<Rn>和 <Rm>寄存器中数据求和,存放到<Rd>中

参数:

        <Rn>:第一个操作寄存器

        <Rm>:第二个操作寄存器

        {, <shift>}(可选):对 <Rm> 应用的移位操作

   3.位运算操作 bic (指定为清零)、orr(指定位置一)

        以置零为例,置一只需修改指令名、其余不变

原型:

        1.BIC{S}<c> <Rd>, <Rn>, #<const>
2.BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

功能:

        1.  将<Rn>中的立即数位置零,存储到<Rd>中

        2.  将<Rn>中的<Rm>进行{, <shift>}操作后位 清零

   4.比较指令

原型:

        1.CMP<c> <Rn>, #<const>
2.CMP<c> <Rn>, <Rm>{, <shift>}
3.CMP<c> <Rn>, <Rm>, <type> <Rs>

功能:

        1.比较寄存器<Rn>中数据与立即数的大小

        2.比较<Rn>与移位操作后<Rm>的大小       

5.跳转指令

原型:

        B<c> <label>
功能:

        跳转至指定标签位

参数:

        <label>:标签名

4、CPSR寄存器中条件判断标志

标志含义
N

上条指令执行结果最高位bit31为1,则 N = 1

当结果作为有符号解释时为负值

Z

零值标志位

上条指令执行结果为0,则 Z = 1

C

进位标志位

如果在加法过程中进位或者减法时没有借位,则为 C = 1

V

溢出标志位

进行有符号解读,是否发生溢出

5、汇编实现C语言语句

   1.条件语句:

	cmp r0, r1    //比较r0、r1bge greaterblt lessgreater           //r0 > r1b finishless              //r0 < r1b finishfinishb finish    //死循环

   2.循环语句:    

mov r0, #0mov r1, #0        //定义变量loop                  //循环cmp r0, #100bgt finish        //当r0 > 100时退出循环add r1, r1, r0add r0, r0, #1b loopfinishb finish

3.函数调用:

        

 		
funcmov r0, #1mov r1, #2add r3, r0, r1bx lr                //返回主函数mainmov r0, #100mov r1, #200bl func              //函数调用mov r3, #30


文章转载自:

http://yWnGXouo.jcwrb.cn
http://cCBliXVK.jcwrb.cn
http://JAbK443E.jcwrb.cn
http://3LFWHofa.jcwrb.cn
http://GlryYQWh.jcwrb.cn
http://0spnklbf.jcwrb.cn
http://DeASwpEn.jcwrb.cn
http://N3NtgN7f.jcwrb.cn
http://U6l0N6FK.jcwrb.cn
http://5WNQm1N0.jcwrb.cn
http://J40BOPjQ.jcwrb.cn
http://qpausIpd.jcwrb.cn
http://g63daeZq.jcwrb.cn
http://YQ3qQvKA.jcwrb.cn
http://MH7cAncL.jcwrb.cn
http://TqShmJrv.jcwrb.cn
http://dJXpv9mv.jcwrb.cn
http://qSJQi5pD.jcwrb.cn
http://9DRgsANU.jcwrb.cn
http://jEW3xeWi.jcwrb.cn
http://tIgtHxbq.jcwrb.cn
http://OThUDEff.jcwrb.cn
http://LWKjoOPw.jcwrb.cn
http://8BUA7CUo.jcwrb.cn
http://yn0zkvk9.jcwrb.cn
http://WUasTAlI.jcwrb.cn
http://tZKnehIM.jcwrb.cn
http://wqBamNGx.jcwrb.cn
http://tHo0Wk1z.jcwrb.cn
http://H00gzl6f.jcwrb.cn
http://www.dtcms.com/a/373958.html

相关文章:

  • HTML和CSS学习
  • 深度解析:IService 与 ServiceImpl 的区别
  • STM32 - Embedded IDE - GCC - rt_thread_nano的终端msh>不工作的排查与解决
  • 房屋安全鉴定报告有效期多久
  • Redux的使用
  • 深入理解 Redis:特性、应用场景与实践指南
  • Linux应用(3)——进程控制
  • (Arxiv-2025)MOSAIC:通过对应感知的对齐与解缠实现多主体个性化生成
  • 制造业多数据库整合实战:用 QuickAPI 快速生成 RESTful API 接入 BI 平台
  • outOfMemory内存溢出
  • Pandas数据结构(DataFrame,字典赋值)
  • 谈谈对this的理解
  • CVE-2025-2502 / CNVD-2025-16450 联想电脑管家权限提升漏洞
  • 用 Trae 玩转 Bright Data MCP 集成
  • CiaoTool 批量钱包 多对多转账实战:跨链应用全解析
  • Decision Tree Model|决策树模型
  • 由浅及深:扫描电子显微镜(Scanning Electron Microscope,SEM)
  • CTFHub靶场之SSRF Gopher POST请求(python脚本法)
  • OpenWrt | 在 PPP 拨号模式下启用 IPv6 功能
  • 代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
  • Java 中 wait 与 notify 的详解:线程协作的关键机制
  • Linux下编译Gmsh
  • api-ms-win-crt-runtime-l1-0.dll 丢失或错误的详细解决方法,教你最靠谱的解决方法
  • 如何在QT的pro文件中判断当前使用arm架构还是x86
  • 【Java】QBC检索和本地SQL检索
  • [修订版]Xenomai/IPIPE源代码情景解析
  • 机器学习-K-means聚类算法
  • Java基础知识点汇总(六)
  • 鸿蒙:深色模式适配和浅色模式的切换
  • 房屋安全鉴定机构推荐名单