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
相关推荐
sucool_lb11 小时前
GEM5学习(5): ARM 架构功耗仿真
arm开发·学习
Joshua-a2 天前
macOS下arm编译缺少stdint.h等问题
arm开发·macos
蚂蚁舞2 天前
在arm架构的Debian系统手动安装和卸载Mysql8的操作
arm开发·debian·安装mysql·mysql8·卸载mysql
m0_571372822 天前
嵌入式学习——ARM 体系架构1
arm开发·学习
生涯にわたる学び2 天前
自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
arm开发
李小白202002022 天前
windows 10系统安装arm虚拟机
arm开发
亿道电子Emdoor4 天前
【ARM】PACK包管理
arm开发
wypywyp5 天前
基于arm芯片的驱动开发——温湿度传感器dht11
arm开发·驱动开发
亿道电子Emdoor5 天前
【ARM】MDK如何实现使用Hex文件完成程序烧录
arm开发·stm32·单片机