添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
行走的苹果  ·  C# ...·  2 月前    · 
愉快的眼镜  ·  公路车购买指南 ...·  6 月前    · 
重感情的风衣  ·  Dremio is exiting . ...·  6 月前    · 
咆哮的青蛙  ·  MATLAB-GNU Octave教程 - ...·  9 月前    · 
  • 嵌入式linux开发 (18)
  • 机器学习笔记 (24)
  • 收藏的一些好文 (3)
  • 写点什么 (13)
  • 关于网站 (4)
  • ubuntu系统教程 (24)
  • Debian系统教程 (16)
  • windows软件开发 (21)
  • 数字信号处理 (11)
  • 嵌入式开发笔记 (26)
  • 电路设计与调试 (9)
  • 打工琐记 (25)
  • CC3200开发 (5)
  • C/C++开发笔记 (14)
  • PHP后端服务开发 (18)
  • 计算机视觉 (29)
  • FPGA 开发 (5)
  • 5G NR (2)
  • Python软件开发 (5)
  • 云计算 (0)
  • 计算机程序与解释 (4)
  • Web前端 (1)
  • 软核OR1200 (6)
  • Cortex-M0开发笔记 (12)
  • LiteOS笔记 (1)
  • 泊松分布 深度估计 FPGA Cortex-M0异常中断 A5 LiteOS ds1302 PCB make使用变量 arm920t 特征匹配 基本数据类型 OR1200软核 lamda表达式 C# cuda8.0 CCS4 表达式 列表推导 iverilog Nvidia驱动 无免费午餐理论 Ubuntu12.04 人生名文 阿里云 DHT11通信 JSON 泛化 csv处理 JSMN 机器学习 函数定义 NvidiaGPU 数据迁移 电路开发 内核编译 Cortex-M0 Cortex-M0综述 git A3 个人随记 IOT Allegro 函数测试 Gerber 汇编 Cortex-M0存储器 Cortex-M0体系 抽象边界 下载 应用场景 系统文件移植 netty make控制函数 嵌套表达式 OR1200 期望 网络开发 nympy

    1. Cortex基本指令

    为了将回路大小降至最低,Cortex-M0所基于的ARMv6-M体系结构只使用了16位Thumb指令和一小部分的32位Thumb指令。

    Cortex-M0支持的基本16位Thumb指令:

    thumb_16位指令 thumb_16位指令.png

    Cortex-M0 支持多个基于Thumb-2技术的32位Thumb指令。

    • MRS和MSR,特殊寄存器访问指令;

    • LSB、DSB和DMB,存储器同步指令;

    • BL指令(BL被包含在传统的Thumb指令集中,而其位域定义在Thumb-2中得到扩展)

    thumb_32位指令.png

    thumb_32位指令.png 关于指令细节,参考书籍 《DDI0419C_arm_architecture_v6m_reference_manual》

    2. 汇编基础

    根据功能可以将Cortex-M0处理器的指令划分为以下几组:

    • 在处理器内移动数据

    • 存储器访问

    • 栈空间访问

    • 算术运算

    • 逻辑运算

    • 移位和循环操作

    • 展开和顺序反转操作

    • 程序流程控制(跳转、条件跳转和函数调用)

    • 存储器屏蔽指令

    • 异常相关指令

    • 休眠模式特性相关指令

    • 其他功能

    2.1 存储器访问

    Cortex-M0 处理器支持多个存储器访问指令,并且支持各种宽度的数据传输和寻址方式。可以使用的数据宽度包括字(4字节)、半字(2字节)和字节,另外对有符号和无符号数,还有不同的指令。

    存储器访问指令 存储器访问指令.png

    重要提醒:

    进行存储访问时,应确保地址是对齐的。例如,执行字访问需要操作地址的最低两位为0,半字访问则需要操作地址的最低为0。

    2.2 栈空间访问

    栈空间访问可以通过两个专用存储器访问指令执行,PUSH指令用于减小当前栈指针并且将数据存储到栈中,POP指令则从栈中读出数据并且增加当前的栈指针。

    PUSH_POP PUSH_POP.png

    2.3 程序流程控制

    Cortex-M0处理器支持5个跳转指令(B、B<cond>(条件跳转)、BL(跳转并链接)、BX(跳转并交换)、BLX(跳转链接并交换))。他们对于诸如循环及条件执行等程序流控制尤其重要,并且还可以用于将程序代码划分为函数和子程序。

    BL BL.png

    BL通常用于函数或子程序的调用。执行BL时,下一条指令的地址会被存储到链接寄存器(LR)中,并且最低置1。当函数或子函数完成指定的任务后,可以通过执行"BX LR"指令返回到调用程序。

    BX_BL BX_BL.png

    2.4 异常相关指令

    Cortex-M0 处理器中包含了一条被称为请求管理(SVC)的指令。如果SVC的中断优先级大于当前执行的中断,这条指令就会立即触发SVC中断。

    SVC SVC.png

    SVC指令使用一个8位立即数,这个参数不会直接影响SVC中断,而是执行SVC中断处理时,它会作为SVC函数的参数被提取出来。SVC一般可以作为系统服务的入口或者应用程序编程接口(API),这个参数可以用作指明所需的系统服务。

    CPS CPS.png

    除了MSR指令,也可以使用CPS指令改变PRIMASK特殊寄存器的值。

    2.5 休眠模式特性相关指令

    通过执行WFI(等待中断)和WFE(等待事件)指令来进入休眠模式。

    WFI WFI.png

    WFE同WFI类似,只是可以将它唤醒的事件不同。事件可以是中断、SEV指令的执行或者进入调试状态。

    WFE也可以被外部事件输入信号唤醒,这通常用于多处理器环境中。

    WFE.png

    2.6 其它指令

    Cortex-M0支持NOP指令,该指令可用作指令对齐或延时。

    NOP NOP.png

    断点指令可以在调试中提供断点功能。调试器执行到断点时,处理器暂停处理,用户就可以使用调试器执行调试任务。

    BKPT.png

    3. 指令集实例

    3.1 函数调用和函数返回

    函数调用 函数调用.png

    当执行函数调用时(或子程序调用),需要保存返回地址,也就是调用指令后的下一条指令的地址。

    执行完BL/BLX指令后,返回地址被保存在链接寄存器(LR/R14),这样在调用的函数执行完毕后还能进行函数返回。

    嵌套函数调用和函数返回:

    嵌套函数调用.png 嵌套函数调用

    对函数中的多个寄存器进行压栈和出栈操作:

    对函数中多寄存器压出栈 对函数中多寄存器压出栈.png

    3.2 跳转表

    使用C编程时,利用switch语句,可以根据输入值使程序跳转到多个可能的地址上。

    使用汇编编程时,也可以实现类似操作:建立跳转目的地址表,根据输入计算表格的偏移并将其加载(LDR),然后使用BX执行跳转。

    汇编case跳转 汇编case跳转.png

    如上,R0中的可选输入为0-3,其对应程序跳转分支为Dest0 到 Dest3。

    注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签: ARM , Cortex-M0 , Cortex-M0指令集 , 汇编