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、r1
	bge greater
	blt less

greater           //r0 > r1
	b finish

less              //r0 < r1
	b finish

finish
    b finish    //死循环

   2.循环语句:    


		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.函数调用:

        

 		
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值