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>寄存器中

  1. 将<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.条件语句:

cs 复制代码
	cmp r0, r1    //比较r0、r1
	bge greater
	blt less

greater           //r0 > r1
	b finish

less              //r0 < r1
	b finish

finish
    b finish    //死循环

2.循环语句:

cs 复制代码
		mov r0, #0
		mov r1, #0        //定义变量

	loop                  //循环
		cmp r0, #100
		bgt finish        //当r0 > 100时退出循环
		add r1, r1, r0
		add r0, r0, #1
		b loop
	
	finish
		b finish

3.函数调用:

cs 复制代码
 		
func
	mov r0, #1
	mov r1, #2
	add r3, r0, r1
	bx lr                //返回主函数

main
	mov r0, #100
	mov r1, #200
	bl func              //函数调用
	mov r3, #30
相关推荐
馨羽的玩具28 分钟前
Windows系统安装arm麒麟系统
arm开发·windows
三毛20041 小时前
玳瑁的嵌入式日记---0928(ARM--UART)
网络·arm开发
上园村蜻蜓队长3 小时前
ARM芯片架构之调试访问端口(DAP)
arm开发·单片机·fpga开发·架构
GilgameshJSS14 小时前
STM32H743-ARM例程9-IWDG看门狗
c语言·arm开发·stm32·单片机·嵌入式硬件·学习
月盈缺15 小时前
学习嵌入式的第四十一天——ARM——时钟与定时器
arm开发·学习
DebugKitty19 小时前
硬件开发2-ARM裸机开发3-I.MX6ULL - 时钟、定时器
arm开发·fpga开发·定时器·时钟
生涯にわたる学び1 天前
关于之前知识的一些补充 02
linux·arm开发
XINVRY-FPGA1 天前
XC7A100T-2CSG324I 赛灵思 Xilinx AMD Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信号处理·dsp开发·fpga
扫地的小何尚1 天前
CUDA 13.0深度解析:统一ARM生态、UVM增强与GPU共享的革命
arm开发·人工智能·自然语言处理·gpu·nvidia·jetson·nvidia thro
三毛20041 天前
玳瑁的嵌入式日记---0928(ARM--I2C)
arm开发