登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』ARM Cortex-M0 全可编程SoC原理及实现——面向处理器、协议、外设、编程和操作系统

書城自編碼: 2962506
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: 何宾
國際書號(ISBN): 9787302457329
出版社: 清华大学出版社
出版日期: 2017-03-01
版次: 1 印次: 1
頁數/字數: 479页
書度/開本: 16开 釘裝: 平装

售價:NT$ 569

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
秘史:英国情报机构的崛起
《 秘史:英国情报机构的崛起 》

售價:NT$ 381.0
李鸿章及其时代:中西方世界的历史撞击
《 李鸿章及其时代:中西方世界的历史撞击 》

售價:NT$ 330.0
剑桥罗马骑士等级史(历史学堂)
《 剑桥罗马骑士等级史(历史学堂) 》

售價:NT$ 1277.0
脉络:小我与大势
《 脉络:小我与大势 》

售價:NT$ 484.0
权势转移:近代中国的思想与社会(修订版)
《 权势转移:近代中国的思想与社会(修订版) 》

售價:NT$ 435.0
欧洲四千年
《 欧洲四千年 》

售價:NT$ 435.0
孙中山与海南(1905—1913)
《 孙中山与海南(1905—1913) 》

售價:NT$ 429.0
故宫雅趣:紫禁城皇室生活与君臣轶事
《 故宫雅趣:紫禁城皇室生活与君臣轶事 》

售價:NT$ 484.0

建議一齊購買:

+

NT$ 443
《 ARM处理器开发详解:基于ARM Cortex-A9处理器的开发设计 》
+

NT$ 960
《 Xilinx Zynq-7000嵌入式系统设计与实现:基于ARM Cortex-A9双核处理器和Vivado的设计方法 》
+

NT$ 360
《 STM32F0系列Cortex-M0原理与实践 》
+

NT$ 656
《 Xilinx FPGA权威设计指南——Vivado 2014集成开发环境 》
+

NT$ 432
《 STM32F0系列ARM Cortex-M0核微控制器开发与应用(配光盘) 》
編輯推薦:
1. 知识融合 将ARM公司开源的Cortex-M0 IP用于典型嵌入式系统设计,内容涵盖了处理器架构、指令集、汇编语言、协议、接口、C语言、操作系统等方面的知识。2. 深入分析 在本书中,通过Xilinx 7系列现场可编程门阵列(FPGA)实现Cortex-M0嵌入式系统硬件设计;通过Keil Vision5集成开发环境,实现软件程序设计。此外,通过软件和硬件开发工具提供的仿真、调试和跟踪功能,深度分析了处理器内部架构、处理器与存储器和外设之间的通信机制,以及软件和硬件协同设计方法。3. 知识权威 在编写本书的过程中,ARM公司课程开发团队提供了大量的教学参考资料,包括设计案例、教学课件以及技术文档等。使得本书能从硬件和软件两个方面准确反映Cortex-M0嵌入式系统的设计和实现方法。4. 实例丰富 提供了Cortex-M0典型应用的设计案例、设计代码和参考资料,便于读者自学,快速动手实践。
內容簡介:
本书以ARM公司免费开放的CortexM0 DesignStart处理器 IP核为基础,以CortexM0处理器架构、AMBA规范、外设、汇编语言、C语言、CMSIS、驱动程序开发以及RTX操作系统为主线,详细介绍了通过Xilinx Vivado以及Keil μVision5集成开发环境构建CortexM0全可编程嵌入式系统的硬件和软件设计方法。
全书共分18章,主要内容包括: 全可编程SoC设计导论、CortexM0 CPU结构、CortexM0指令集、CortexM0低功耗特性、AHBLite总线结构分析、CortexM0汇编语言编程基础、CortexM0 DesignStart架构、Xilinx Artix7 FPGA结构、CortexM0嵌入式系统设计与实现、7段数码管控制器设计与实现、中断系统设计与实现、定时器设计与实现、UART串口控制器设计与实现、VGA控制器设计与实现、DDR3存储器系统设计与实现、CortexM0 C语言编程基础、CMSIS和驱动程序开发、RTX操作系统原理及应用。
本书可作为讲授ARM CortexM0嵌入式系统课程以及CortexM0可编程SoC系统设计课程的教学参考用书,也可作为学习Xilinx Vivado集成开发环境和Verilog HDL语言的参考用书。
關於作者:
何宾:著名的嵌入式技术和EDA技术专家,长期从事电子设计自动化方面的教学和科研工作,与全球多家知名的半导体厂商和EDA工具厂商大学计划保持紧密合作。目前已经出版嵌入式和EDA方面的著作30余部,内容涵盖电路仿真、电路设计、可编程逻辑器件、数字信号处理、单片机、嵌入式系统、片上可编程系统等。典型的代表作有《Xilinx FPGA设计权威指南》《Xilinx FPGA数字设计从门级到行为级的双重描述》《Xilinx FPGA数字信号处理权威指南从HDL、模型到C的描述》《Xilinx All Programmable Zynq-7000 嵌入式系统设计与实现》《模拟与数字系统协同设计权威指南Cypress集成开发环境》《STC单片机原理及应用》《STC单片机C语言程序设计》《Altium Designer 13.0电路设计、仿真与验证权威指南》《Altium Designer 15.0电路仿真、设计、验证与工艺实现权威指南》。
目錄
目录

第1章全可编程SoC设计导论

1.1SoC基础知识

1.1.1SoC的概念

1.1.2SoC与MCU及CPU的比较

1.1.3典型的商用SoC器件

1.2SoC设计流程

1.3SoC体系架构

1.4全可编程SoC技术

1.4.1基于软核的全可编程SoC

1.4.2基于硬核的全可编程SoC

1.5全可编程SoC设计流程

第2章CortexM0 CPU结构

2.1ARM处理器类型

2.2CortexM系列处理器概述

2.2.1CortexM系列处理器的特点

2.2.2CortexM系列处理器的性能参数

2.3CortexM0处理器性能和结构

2.3.1CortexM0处理器的性能

2.3.2CortexM0处理器的结构

2.4CortexM0处理器寄存器组

2.4.1通用寄存器

2.4.2堆栈指针

2.4.3程序计数器

2.4.4链接寄存器

2.4.5组合程序状态寄存器

2.4.6中断屏蔽特殊寄存器

2.4.7特殊寄存器

2.5CortexM0存储器空间映射

2.6CortexM0程序镜像原理及生成方法

2.7CortexM0的端及分配

2.8CortexM0处理器异常及处理

2.8.1异常原理

2.8.2异常优先级

2.8.3向量表

2.8.4异常类型

第3章CortexM0指令集

3.1Thumb指令集

3.2CortexM0汇编语言格式

3.3寄存器访问指令: MOVE

3.4存储器访问指令: LOAD

3.5存储器访问指令: STORE

3.6多数据访问指令: LDM和STM

3.7堆栈访问指令: PUSH和POP

3.8算术运算指令

3.8.1加法指令

3.8.2减法指令

3.8.3乘法指令

3.8.4比较指令

3.9逻辑操作指令

3.10移位操作指令

3.10.1右移指令

3.10.2左移指令

3.11反序操作指令

3.12扩展操作指令

3.13程序流控制指令

3.14存储器屏蔽指令

3.15异常相关指令

3.16休眠相关指令

3.17其他指令

3.18数据插入和对齐操作

第4章CortexM0低功耗特性

4.1低功耗要求

4.2CortexM0低功耗特性及优势

4.2.1CortexM0低功耗特性

4.2.2CortexM0低功耗结构

4.3CortexM0休眠模式

4.4唤醒中断控制器

4.5降低功耗的其他方法

第5章AHBLite总线结构分析

5.1总线及分类

5.1.1总线的概念

5.1.2总线分类

5.2ARM AMBA系统总线

5.3AMBA3 AHBLite总线

5.3.1AHBLite概述

5.3.2AHBLite总线操作

5.4AHBLite总线结构

5.4.1全局信号

5.4.2AHBLite主设备接口

5.4.3AHBLite从设备接口

5.4.4地址译码器和多路复用器

5.5AHBLite总线时序

5.5.1无等待基本读传输

5.5.2有等待基本读传输

5.5.3无等待基本写传输

5.5.4有等待基本写传输

5.6硬件实现

第6章CortexM0汇编语言编程基础

6.1Keil MDK开发套件

6.1.1下载MDK开发套件

6.1.2安装MDK开发套件

6.1.3MDK程序处理流程

6.2CortexM0汇编语言程序设计

6.2.1建立新设计工程

6.2.2工程参数设置

6.2.3添加汇编文件

6.2.4汇编语言语法

6.3.lst文件分析

6.4.map文件分析

6.5.hex文件分析

6.6软件仿真和调试

6.6.1查看CortexM0寄存器内容

6.6.2查看CortexM0存储器内容

6.6.3查看监视窗口的内容

6.7汇编语言其他常用语法介绍

6.7.1标识符的命名规则

6.7.2变量

6.7.3常数

6.7.4EQU命令

6.7.5IMPORTEXTERN命令

6.7.6子程序调用

6.7.7宏定义和使用

第7章CortexM0 DesignStart架构

7.1获取CortexM0
DesignStart

7.2CortexM0 DesignStart顶层符号

7.2.1中断

7.2.2状态输出

7.2.3事件信号

7.3AHBLite接口

7.4将CortexM0
DesignStart集成到系统的方法

第8章XILINX Artix7 FPGA结构

8.1Artix7器件逻辑资源

8.2可配置逻辑块

8.2.1可配置逻辑块概述

8.2.2查找表

8.2.3多路复用器

8.2.4进位逻辑

8.2.5存储元素

8.2.6分布式RAM(只有SLICEM)

8.2.7只读存储器(ROM)

8.2.8移位寄存器(只有SLICEM)

8.3时钟资源和时钟管理单元

8.3.17系列FPGA时钟资源

8.3.27系列内部时钟结构

8.3.37系列FPGA时钟管理模块

8.4块存储器资源

8.5专用的DSP模块

8.6输入输出块

8.6.1IO特性概述

8.6.2Artix7中的IO列和类型

8.6.3IO电气资源

8.6.4IO逻辑资源

8.7XADC模块

8.8吉比特收发器

8.9PCIE模块

8.10配置模块

8.11互连资源

第9章CortexM0嵌入式系统设计与实现

9.1设计目标

9.2CortexM0 SoC系统的构建

9.2.1启动Vivado 2016集成开发环境

9.2.2创建新的设计工程

9.2.3添加CortexM0处理器源文件

9.2.4添加系统主时钟IP核

9.3设计文件修改和分析

9.3.1AHB总线地址译码器

9.3.2AHB总线从设备多路复用器

9.3.3AHB片上存储器外设

9.3.4AHB LED外设

9.3.5AHBLITE_SYS顶层文件

9.4程序代码的编写

9.4.1建立新设计工程

9.4.2工程参数设置

9.4.3添加和编译汇编文件

9.4.4分析HEX文件与汇编文件的关系

9.4.5添加HEX文件到当前工程

9.5RTL详细描述和分析

9.6仿真原理和行为级仿真

9.6.1仿真实现的不同功能

9.6.2Vivado所支持的仿真工具

9.6.3行为级仿真实现

9.6.4添加信号并仿真

9.6.5仿真结果分析

9.7设计综合和分析

9.7.1综合过程的关键问题

9.7.2设计综合选项

9.7.3Vivado支持的属性

9.7.4执行设计综合

9.7.5查看综合报告

9.8创建实现约束

9.8.1实现约束的原理

9.8.2IO规划器功能

9.8.3引脚位置约束的实现

9.9设计实现和分析

9.9.1实现过程原理

9.9.2设计实现选项

9.9.3设计实现

9.9.4查看布局布线后的结果

9.9.5查看实现后的报告

9.9.6功耗分析

9.9.7静态时序分析

9.10实现后时序仿真

9.11生成编程文件

9.12下载比特流文件到FPGA

9.13生成并下载外部存储器文件

第10章7段数码管控制器设计与实现

10.1设计目标

10.2打开前面的设计工程

10.3添加并分析7段数码管控制器源文件

10.3.1添加7段数码管控制器源文件

10.3.2分析7段数码管控制器源文件

10.4修改并分析顶层设计文件

10.5编写程序代码

10.5.1建立新设计工程

10.5.2工程参数设置

10.5.3添加和编译汇编文件

10.5.4添加HEX文件到当前工程

10.6设计综合

10.7添加约束条件

10.8设计实现

10.9下载比特流文件

10.10系统在线调试原理

10.11系统在线调试实现

10.11.1建立新的调试工程

10.11.2添加调试网络

10.11.3在线测试分析

第11章中断系统设计与实现

11.1设计目标

11.2中断控制器原理

11.2.1NVIC特点

11.2.2NVIC映射

11.2.3NVIC寄存器

11.3进入和退出异常句柄的过程

11.3.1进入中断句柄的过程

11.3.2退出中断句柄的过程

11.4打开前面的设计工程

11.5添加并分析按键消抖模块源文件

11.5.1添加按键消抖模块源文件

11.5.2分析按键消抖模块源文件

11.6修改并分析顶层设计文件

11.7编写程序代码

11.7.1建立新设计工程

11.7.2工程参数设置

11.7.3软件初始化中断

11.7.4添加和编译汇编文件

11.7.5添加HEX文件到当前工程

11.8设计综合

11.9添加约束条件

11.10设计实现

11.11下载比特流文件

第12章定时器设计与实现

12.1设计目标

12.2打开前面的设计工程

12.3添加并分析定时器模块源文件

12.3.1定时器模块设计原理

12.3.2添加定时器源文件

12.3.3分析定时器源文件

12.4修改并分析顶层设计文件

12.5编写程序代码

12.5.1建立新设计工程

12.5.2工程参数设置

12.5.3添加和编译汇编文件

12.5.4添加HEX文件到当前工程

12.6设计综合

12.7设计实现

12.8下载比特流文件

第13章UART串口控制器设计与实现

13.1设计目标

13.2串行通信基础

13.2.1串行和并行通信之间的比较

13.2.2串行通信的类型

13.3通用异步收发数据格式和编码

13.3.1数据格式

13.3.2字符编码规则

13.4UART串口控制器的实现原理

13.4.1UART发送器

13.4.2UART接收器

13.4.3发送器接收器FIFO

13.5打开前面的设计工程

13.6添加并分析UART模块源文件

13.6.1添加UART模块源文件

13.6.2分析UART模块源文件

13.7修改并分析顶层设计文件

13.8编写程序代码

13.8.1建立新设计工程

13.8.2工程参数设置

13.8.3添加和编译汇编文件

13.8.4添加HEX文件到当前工程

13.9设计综合

13.10添加约束条件

13.11设计实现

13.12下载比特流文件

第14章VGA控制器设计与实现

14.1设计目标

14.2VGA工作原理

14.2.1VGA连接器

14.2.2CRT原理

14.2.3VGA接口信号

14.2.4VGA时序

14.3VGA显示硬件实现原理

14.3.1VGA图像缓冲区

14.3.2VGA控制台

14.3.3VGA控制器存储器空间

14.4打开前面的设计工程

14.5添加并分析VGA模块源文件

14.5.1添加VGA模块源文件

14.5.2分析VGA模块源文件

14.6修改其他设计

14.6.1添加并分析顶层设计文件

14.6.2修改时钟生成器输出频率

14.6.3修改波特率时钟

14.7编写程序代码

14.7.1建立新设计工程

14.7.2工程参数设置

14.7.3添加和编译汇编文件

14.7.4添加HEX文件到当前工程

14.8设计综合

14.9添加约束条件

14.10设计实现

14.11下载比特流文件

第15章DDR3存储器系统设计与实现

15.1计算机搭载的存储器设备

15.2存储器类型

15.2.1易失性存储器

15.2.2非易失性存储器

15.3系统设计目标

15.3.1硬件构建目标

15.3.2软件编程目标

15.4DDR3 SDRAM控制器设计原理

15.4.1DDR3 SDRAM存储器结构

15.4.2DDR3 SDRAM控制器结构

15.4.3DDR3 SDRAM的读写访问时序

15.5DDR3 SDRAM控制器系统设计与实现

15.5.1打开前面的设计工程

15.5.2设计DDR3 SDRAM存储器控制器

15.5.3修改系统设计文件

15.5.4编写程序代码

15.5.5设计综合

15.5.6设计实现

15.5.7下载比特流文件

第16章CortexM0 C语言编程基础

16.1C语言处理流程

16.2C语言镜像文件内容和存储

16.2.1C语言镜像文件的内容

16.2.2C语言镜像文件的存储位置

16.3启动代码的分析

16.4C语言中数据的存储空间

16.5C语言数据类型及实现

16.5.1C语言支持的数据类型

16.5.2数据类型修饰符

16.6C语言编程CortexM0

16.6.1定义中断向量表

16.6.2定义堆和堆栈

16.6.3读写外设寄存器

16.6.4汇编调用C函数

16.6.5C语言调用汇编语言

16.6.6C语言嵌入汇编语言

16.7C语言驱动的设计和实现

16.7.1打开前面的设计工程

16.7.2建立新的软件设计工程

16.7.3软件工程参数设置

16.7.4创建并添加汇编文件

16.7.5创建并添加头文件

16.7.6创建并添加C文件

16.7.7添加HEX文件到当前工程

16.7.8设计综合

16.7.9设计实现

16.7.10下载比特流文件

16.8C语言重定向及实现

16.8.1打开前面的设计工程

16.8.2打开前面的软件设计工程

16.8.3修改启动引导文件

16.8.4导入并修改retarget.c文件

16.8.5修改C设计文件

16.8.6添加HEX文件到当前工程

16.8.7设计综合

16.8.8设计实现

16.8.9下载比特流文件

第17章CMSIS和驱动程序开发

17.1引入CMSIS的必要性

17.2CMSIS的优势

17.3CMSIS的框架

17.4使用CMSIS访问不同资源

17.4.1访问NVIC

17.4.2访问特殊寄存器

17.4.3访问特殊指令

17.4.4访问系统

17.5软件驱动程序的设计

17.5.1软件驱动程序的功能

17.5.2AHB外设驱动设计

17.6动态图形交互系统设计

17.6.1动态图形交互硬件平台

17.6.2触摸屏显示控制方法

17.6.3触摸屏触摸控制方法

17.6.4打开前面的设计工程

17.6.5触摸屏控制器模块的设计实现

17.6.6修改顶层设计文件

17.6.7C语言程序的设计和实现

17.6.8设计综合

17.6.9添加约束条件

17.6.10设计实现

17.6.11下载比特流文件

第18章RTX操作系统原理及应用

18.1RTOS的优势

18.2操作系统的概念

18.3操作系统支持特性

18.3.1SysTick定时器

18.3.2堆栈指针

18.3.3SVC

18.3.4PendSV

18.4RTX内核架构的特点

18.5RTX的具体实现过程

18.5.1实现目标

18.5.2打开前面的工程

18.5.3修改工程属性设置

18.5.4修改启动代码

18.5.5导入RTX_Config.c文件

18.5.6修改main.c文件

18.5.7软件调试和测试

18.6RTX内核功能

18.6.1定时器滴答中断

18.6.2系统任务管理器

18.6.3任务管理

18.6.4空闲任务

18.6.5系统资源

18.6.6任务调度策略

18.6.7优先级倒置

18.6.8堆栈管理

18.6.9用户定时器

18.6.10中断函数
內容試閱
前言
在当今社会中,嵌入式系统的应用越来越广泛,例如以智能手机为代表的嵌入式系统应用已经融入人们的日常生活中。英国ARM公司作为全球知名的嵌入式处理器IP核供应商,其所提供的CortexM、CortexR和CortexA三大系列处理器IP核以及基于这些IP核所构建的生态系统,已经成为当今嵌入式系统设计和应用的基础。由于保护知识产权的需要,一直以来ARM公司对其处理器设计技术进行严格保密,这使得掌握Cortex处理器架构并熟练高效应用Cortex处理器变得异常困难。此外,ARM Cortex处理器架构和指令集也比较复杂。这些因素都使得一个嵌入式系统设计人员很难从处理器架构、接口、外设、编程语言和操作系统等方面全面彻底掌握嵌入式系统设计知识。近年来,国内很多高校都相继开设了嵌入式系统相关的课程。但是,由于前面所提到的诸多因素,在市面上已经出版的ARM嵌入式系统教材并没有全面系统地从处理器架构、AMBA规范、接口、外设、编程语言和操作系统等方面全方位系统地对设计嵌入式系统所需要的知识进行解读,这给ARM嵌入式系统技术在国内教育界的普及推广造成很大困难。目前,国内嵌入式系统课程的教学大都局限在APP开发,API函数调用的层面,与工业界对培养高素质嵌入式人才的要求有相当大的差距。去年,ARM公司做了一件让中国教育界非常高兴的事情,它提供了免费开放的CortexM0 DesignStart内核等效RTL级设计代码,可用于中国高校的嵌入式系统课程教学。通过ARM大学计划经理陈玮先生的帮助,本书作者得到了这个免费开放的CortexM0 DesignStart内核RTL级等效设计代码。通过这个免费开放的CortexM0 DesignStart IP核以及Xilinx的Vivado 2016.1集成开发环境,作者在Xilinx最新的7系列FPGA内构建了CortexM0嵌入式系统硬件,同时,通过Keil Vision5集成开发环境为该嵌入式系统硬件开发了软件应用程序。与传统采用专用CortexM处理器介绍嵌入式系统设计的教学模式相比,采用在FPGA内构建CortexM0嵌入式系统的方法可以为嵌入式系统课程的教学带来以下好处:(1) 当采用开放的CortexM0内核构建嵌入式系统时,教师和学生可以清楚地理解CortexM0的运行机制,包括处理器架构、指令集、存储器空间映射和中断机制。(2) 通过对AHBLite规范的详细介绍和说明,教师和学生可以清楚地知道在一个芯片内将CortexM0嵌入式处理器与外设模块和存储器系统连接的方法。(3) 通过使用Verilog HDL对实现特定功能外设的寄存器传输级RTL描述,教师和学生可以清楚地理解软件寄存器与硬件逻辑行为之间的关系,也就是将软件命令转换成硬件逻辑行为的方法。(4) 通过为所定制的CortexM0嵌入式系统硬件编写软件应用,教师和学生可以彻底理解和掌握软件和硬件协同设计、协同仿真和协同调试的方法。(5) 基于开放的CortexM0 DesignStart IP核,教师和学生可以从硬件底层逐步完成嵌入式系统的构建,以深入理解和全面掌握嵌入式系统的设计流程。正是由于这种方法在未来嵌入式系统课程教学中有着无可比拟的巨大优势,使得作者可以从处理器架构、指令集、AHBLite规范、汇编语言、C语言、外设、CMSIS和驱动,以及操作系统等几个方面,全方位地对嵌入式系统的构建方法进行介绍,以期解决目前国内高校嵌入式系统课程教学所面临的困境,并且为学习更高层次的嵌入式系统设计和应用抛砖引玉。本书的最大特色就是将嵌入式系统的设计理论和实践深度融合,通过典型且完整的设计案例多角度全方位地解读嵌入式系统的设计方法。为了方便老师的教学和学生的自学,本书提供了教学课件和设计实例的完整代码,以及公开的视频教学资源,这些资源的获取方式详见书中的学习说明。本书的编写得到了ARM大学计划经理陈玮先生的大力支持和帮助,他为本书申请了免费开放的CortexM0 DesignStart IP核设计资源以及教学资源。此外,Xilinx公司的FAE对作者设计案例时遇到的问题进行了耐心细致的回答。作者的研究生李宝隆编写了本书第1章的内容,张艳辉编写了本书第2章的内容,作者的本科生汤宗美编写并整理了本书的配套教学课件,王中正对本书的部分设计案例进行了验证。此外,在本书编写期间,平凉职业技术学院的惠小军和唐海天老师进行了相关内容的学习,并帮助作者编写了第17章和第18章的内容。他们的支持和帮助是作者高质量按时完成该书的重要保证,在此一并向他们表示感谢。在本书出版的过程中,也得到了清华大学出版社各位编辑的帮助和指导,在此也表示深深的谢意。由于编者水平有限,编写时间仓促,书中难免有疏漏之处,敬请读者批评指正。作者2017年1月于北京


第3章CortexM0指令集
本章介绍ARM CortexM0指令集,内容包括: Thumb指令集、
CortexM0汇编语言格式、寄存器访问指令(MOVE)、存储器
访问指令(LOAD和STORE)、多数据访问指令、堆栈访问指令
、算术指令、逻辑操作指令、移位操作指令、反序操作指令、扩展
操作指令、程序流控制指令、存储器屏蔽指令、异常相关指令和其
他指令。本章为后续学习汇编语言和C语言编程模型打下基础。3.1Thumb指令集早期的ARM处理器使用了32位指令集,称为ARM指令。该指令集
具有较高的运行性能。与8位和16位的处理器相比,有更大的程序
存储空间,但是也带来了较大的功耗。在1995年,16位的Thumb1指令集首先应用在ARM7TDMI处
理器上,它是ARM指令集的子集。与32位的RISC结构相比,它提
供了更好的代码密度,将代码长度减少了30%,但是性能也降低了
20%。通过使用多路复用器,它能与ARM指令集一起使用,如图
3.1所示。
图3.1Thumb指令选择
Thumb2指令集由32位的Thumb指令和最初的16位Thumb指
令组成,与32位的ARM指令集相比,代码长度减少了26%,并保
持相似的运行性能。CortexM0采用了ARMv6M的结构,将电路规模降低到最小,
它采用了16位Thumb1的超集,以及32位Thumb2的最小子
集。表3.1给出了CortexM0支持的16位Thumb指令,表3.2给
出了CortexM0支持的32位Thumb指令。
表3.1CortexM0支持的16位Thumb指令
ADCSADDSADRANDSASRSBBICBLXBKPTBX
CMNCMPCPSEORSLDMLDRLDRHLDRSHLDRBLDRSBLSLSLSRSMOVMVNMULSNOPORRSPOPPUSHREVREV16REVSHRORRSBSBCSSEVSTMSTRSTRHSTRBSUBSSVCSXTBSXTHTSTUXTBUXTHWFEWFIYIELD
表3.2CortexM0支持的32位Thumb指令
BLDSBDMBISBMRSMSR
思考与练习31: 说明Thumb指令集的主要特点。思考与练习32: 说明Thumb1指令集和Thumb2指令集的
区别。3.2CortexM0汇编语言格式ARM汇编语言适用于ARM RealView开发组件和Keil使用下面的
指令格式:
标号
助记符 操作数1, 操作数2,;注释
其中:1 标号: 用作地址位置的参考,即符号地址。2 助记符: 指令的汇编符号表示。3 操作数1: 目的操作数。4 操作数2: 源操作数。5 注释: 在符号;后表示对该行指令的注解。注解的存在不影
响汇编器对该行指令的理解。注: 对于不同类型的指令,操作数数量也会有所不同。有些指令不
需要任何操作数,而有些指令只需要一个操作数。下面的指令
MOVS R3, #0x11
将立即数0x11复制到R3寄存器。注: 可以通过ARM汇编器armasm或者不同厂商的汇编工具
GNU工具链对该代码进行汇编将其转换成机器指令。当使用GNU
工具链时,对标号和注释的语法会稍有不同。CortexM0的一些指令,需要在其后面添加后缀,如表3.3所示。
表3.3后缀及含义
后缀标志含义
S更新APSR 标志EQZ=1等于
续表
后缀标志含义
NEZ=0不等于CSHSC=1高或者相同,无符号CCLOC=0低,无符号MIN=1负数PLN=0正数或零VSV=1溢出VCV=0无溢出HIC=1和Z=0高,无符号LSC=0或Z=1低或者相同,无符号GEN=V大于或者等于,有符号LTN!=V小于,有符号GTZ=0和N=V大于,有符号LEZ=1和N!=V小于等于,有符号
思考与练习33: 说明CortexM0汇编语言指令的格式及特点。3.3寄存器访问指令: MOVE本节介绍寄存器访问指令: MOVE,下面对该类指令进行详细说
明。1) MOV , #immed8该指令将立即数immed8范围0~255复制到寄存器Rd中。下面的
指令
MOV R0, #0x31
将寄存器R1的内容复制到寄存器R0中。2) MOV , 该指令将Rm寄存器的内容复制到Rd寄存器中。下面的指令
MOV R0, R1
将寄存器R1的内容复制到寄存器R0中。3) MOVS , 该指令将Rm寄存器的内容复制到Rd寄存器中,并且更新APSR寄
存器中的Z和N标志。下面的指令
MOVS R0, R1
将寄存器R1的内容复制到寄存器R0中,并且更新APSR寄存器中
的标志。4) MOVS , #immed8该指令将立即数immed8范围0~255复制到寄存器Rd中,并且更
新APSR寄存器中的Z和N标志。下面的指令
MOVS R0, #0x31
将数字0x31 十六进制复制到寄存器R0中,并且更新APSR寄存
器中的Z和N标志。5) MRS , 该指令将由SpecialReg标识的特殊寄存器内容复制到寄存器Rd中
,该指令不影响APSR寄存器中的任何标志位。下面的指令
MRS R1, CONTROL
将CONTROL寄存器的内容复制到寄存器R1中。6) MSR , 该指令将寄存器Rd中的内容复制到SpecialReg标识的特殊寄存器
中,该指令影响APSR寄存器中的N、Z、C和V标志,下面的指令
MSR PRIMASK, R0
将寄存器R0的内容复制到PRIMASK寄存器中。注: SpecialReg所标识的特殊寄存器可以是以下任意一个:
APSR、IPSR、EPSR、IEPSR、IAPSR、EAPSR、PSR、MSP
、PSP、PRIMASK或CONTROL。思考与练习34: 说明下面指令所实现的功能。1 MOVS R0, #0x000B2 MOVS R1, #0x0 3 MOV R10, R124 MOVS R3, #235 MOV R8, SP3.4存储器访问指令: LOAD本节介绍存储器访问指令: LOAD,下面对该指令进行详细说明,
该指令不影响APSR寄存器中的任何标志位。1. LDR, [,]该指令从[ ]寄存器所指向存储器的地址中取出一个
字32位,并将其复制到寄存器Rt中。下面的指令
LDR R0, [R1, R2]
从[R1 R2]所指向存储器的地址中取出一个字32位,并将其复
制到寄存器R0中。2. LDRH, [,]该指令从[ ]寄存器所指向存储器的地址中取出半个
字16位,将其复制到寄存器Rt的[15∶0]位中,并将寄存器Rt
的[31∶16]位清零。下面的指令
LDRH R0, [R1,R2]
从[R1 R2]所指向存储器的地址中取出半个字16位,将其复制
到寄存器R0的[15∶0]位中。3. LDRB , [,]该指令从[ ]寄存器所指向存储器的地址中取出一个
字节8位,将其复制到寄存器Rt的[7∶0]位中,并将寄存器Rt
的[31∶8]位清零。下面的指令
LDRB R0, [R1, R2]
从[R1 R2]寄存器所指向存储器中,取出一个字节8位,并将
其复制到寄存器R0的[7∶0]位中。4. LDR , [,#immed5]该指令从[零扩展#immed5, [,#immed5]该指令从[零扩展#immed5, [,#immed5]该指令从[零扩展#immed5]指向存储器的地址中取出
一个字节8位,并将其复制到寄存器Rt的[7∶0]位中,用零填
充[31∶8]位。下面的指令
LDRB R0, [R1, #0x1]
从[R1 0x01]指向存储器的地址中取出一个字节,并将其复
制到寄存器Rt的[7∶0]中。注: 零扩展#immed5表示给出立即数#immed5的范围为
00000~11111,这就是#immed5所表示的真正含义。7. LDR, =立即数该指令将立即数加载到寄存器Rt中。下面的指令
LDR R0, =0x12345678
将立即数0x12345678的值复制到寄存器R0中。8. LDR , [PC SP, #immed8]该指令从[PC SP零扩展#immed8, [,]该指令从[Rn Rm]所指向的存储器中取出半个字16位,并将
其复制到Rt寄存器的[15∶0]位中。对于[31∶16]来说,取
决于第[15]位,采用符号扩展:1 当该位为1时,[31∶16]各位均用1填充;2 当该位为0时,[31∶16]各位均用0填充。下面的指令
LDRSH R0, [R1, R2]
从[R1 R2]所指向的存储器地址中取出半个字16位,并将其复
制到R0寄存器的[15∶0]位中,并进行符号扩展。10. LDRSB , [,]该指令从[Rn Rm]所指向存储器的地址中取出一个字节8位,
并将其复制到Rt寄存器[7∶0]中。对于[31∶8]来说,取决于
第[7]位,采用符号扩展:1 当该位为1时,[31∶8]各位均用1填充;2 当该位为0时,[31∶8]各位均用0填充。下面的指令
LDRSB R0, [R1, R2]
从[R1 R2]所指向的存储器中取出一个字节8位,并将其复制
到R0寄存器的[7∶0]位中,并进行符号扩展。思考与练习35: 说明下面指令所实现的功能。1 LDR R1, =0x540000002 LDRSH R1, [R2, R3] 3 LDR R0, LookUpTable4 LDR R3, [PC, #100]3.5存储器访问指令: STORE本节介绍存储器访问指令: STORE,下面对该指令进行详细说明
,该指令不影响APSR寄存器中的任何标志位。1. STR , [,]该指令将Rt寄存器中的字数据复制到[ ]所指向存
储器的地址单元中。下面的指令
STR R0, [R1, R2]
将R0寄存器中的字数据复制到[R1 R2]所指向存储器的地址单
元中。2. STRH , [,]该指令将Rt寄存器的半字,即[15∶0]位复制到[
]所指向存储器的地址单元中。下面的指令
STRH R0,[R1, R2]
将R0寄存器中的[15∶0]位数据复制到[R1 R2]所指向存储
器的地址单元中。3. STRB , [,]该指令将Rt寄存器的字节,即[7∶0]位复制到[
]所指向存储器的地址单元中。下面的指令
STRB R0, [R1, R2]
将R0寄存器中的[7∶0]位复制到[R1 R2]所指向存储器的地
址单元中。4. STR , [,#immed5]该指令将Rt寄存器的字数据复制到[零扩展
#immed5, [, #immed5]该指令将Rt寄存器的半字数据,即[15∶0]位复制到[
零扩展#immed5, [,#immed5]该指令将Rt寄存器的字节数据复制到[零扩展#immed5
]所指向存储器的单元中。下面的指令
STRB R0,[R1, #0x1]
将R0寄存器的字节[7∶0]位复制到[R10x01]所指向存储
器的地址单元中。注: 零扩展#immed5表示给出立即数#immed5的范围为
00000~11111,这就是#immed5所表示的真正含义。7. STR , [SP, #immed8]该指令将Rt寄存器中的字数据复制到[ SP零扩展
#immed5,{,, }该指令将存储器的内容加载到多个寄存器中。下面的指令
LDM R0, {R1, R2 - R7}
实现以下操作:1 将寄存器R0所指向存储器地址单元的内容复制到寄存器R1中;2 将寄存器R0 4所指向存储器地址单元的内容复制到寄存器R2
中;3 将寄存器R0 8所指向存储器地址单元的内容复制到寄存器R3
中;7 将寄存器R0 24所指向存储器地址单元的内容复制到寄存器R7
中。2. LDMIA !, {, , }该指令将存储器的内容加载到多个寄存器中,然后将Rn的值更新
到最后一个地址 4的值。下面的指令
LDMIA R01,{R1, R2 - R7}
实现以下操作:1 将寄存器R0所指向存储器地址单元的内容复制到寄存器R1中;2 将寄存器R0 4所指向存储器地址单元的内容复制到寄存器R2
中;3 将寄存器R0 8所指向存储器地址单元的内容复制到寄存器R3
中;7 将寄存器R0 24所指向存储器地址单元的内容复制到寄存器R7
中。最后,将R0的值更新到最初R0 24 4的值。注: !表示更新寄存器Rn的值。3. STMIA !, {, , }该指令将多个寄存器的内容保存到存储器中,然后将Rn的值递增
到最后一个地址 4的值。下面的指令
STMIA R01, {R1, R2 - R7}
实现以下操作:1 将寄存器R1的内容复制到寄存器R0所指向存储器地址的单元中
;2 将寄存器R2的内容复制到寄存器R0 4所指向存储器地址的单
元中;3 将寄存器R3的内容复制到寄存器R0 8所指向存储器地址的单
元中;7 将寄存器R7的内容复制到寄存器R0 24所指向存储器地址的单
元中。最后,将R0的值更新到最初R0 24 4的值。注: 1 !表示更新寄存器Rn的值。2 可用的寄存器范围为R0~R7。3 对于STM来说,如果Rn也出现在列表中,则Rn应该是列表中
的第一个寄存器。思考与练习37: 说明下面指令所实现的功能。1 LDM R0,{R0,R3,R4}2 STMIA R1!,{R2R4,R6}3.7堆栈访问指令: PUSH和POP本节介绍堆栈访问指令: PUSH和POP,下面对这些指令进行详细
说明。1. PUSH {, , }该指令将一个多个寄存器保存到寄存器入栈,并且更新堆栈指针
寄存器。下面的指令
PUSH {R0, R1, R2 }
实现以下操作:1 将寄存器R0中的内容保存到SP-4所指向堆栈空间的地址单元中
;2 将寄存器R1中的内容保存到SP-8所指向堆栈空间的地址单元中
;3 将寄存器R2中的内容保存到SP-12所指向堆栈空间的地址单元
中。最后,将SP-12的结果作为SP最终的值。2. POP {, , }该指令将存储器中的内容恢复到多个寄存器中,并且更新堆栈指针
寄存器。下面的指令
POP { R0, R1, R2 }
实现以下操作:1 将SP所指向堆栈空间地址单元的内容恢复到寄存器R2中;2 将SP 4所指向堆栈空间地址单元的内容恢复到寄存器R1中;3 将SP 8所指向堆栈空间地址单元的内容恢复到寄存器R0中。最后,将SP 12的结果作为SP最终的值。思考与练习38: 说明下面指令所实现的功能。1 PUSH {R0,R4R7}2 PUSH {R2,LR} 3 POP {R0,R6,PC} 3.8算术运算指令本节介绍算术运算指令,包括加法指令、减法指令和乘法指令。3.8.1加法指令1. ADDS, ,
该指令将Rn寄存器的内容和Rm寄存器的内容相加,结果保存在寄
存器Rd中,并更新寄存器APSR中的N、Z、C和V标志。下面的指

ADDS R0, R1, R2
将R1寄存器的内容和R2寄存器的内容相加,结果保存在寄存器R0
中,并且更新寄存器APSR中的标志。2. ADDS, , #immed3该指令将Rn寄存器的内容和立即数#immed3该立即数的范围为
000~111相加,结果保存在寄存器Rd中,并更新寄存器APSR中
的N、Z、C和V标志。下面的指令
ADDS R0,R1, #0x01
将R1寄存器的内容和立即数0x01相加,结果保存在寄存器R0中,
并且更新寄存器APSR中的标志。3. ADDS, #immed8该指令将Rd寄存器的内容和立即数#immed8该立即数的范围为
00000000~11111111相加,结果保存在寄存器Rd中,并更新寄
存器APSR中的N、Z、C和V标志。下面的指令
ADDS R0, #0x01
将R0寄存器的内容和立即数0x01相加,结果保存在寄存器R0中,
并更新寄存器APSR中的标志。4. ADD , 该指令将Rd寄存器的内容和Rn寄存器的内容相加,结果保存在寄
存器Rd中,不更新寄存器APSR中的标志。下面的指令
ADD R0, R1
将R0寄存器的内容和R1寄存器的内容相加,结果保存在寄存器R0
中,不更新寄存器APSR中的标志。5. ADCS, 该指令将Rd寄存器的内容、Rm寄存器的内容和进位标志相加,结
果保存在寄存器Rd中,并更新寄存器APSR中的N、Z、C和V标志
。下面的指令
ADCS R0, R1
将R0寄存器的内容、R1寄存器的内容和进位标志相加,结果保存
在寄存器R0中,并且更新寄存器APSR中的标志。6. ADD , PC, #immed8该指令将PC寄存器的内容和立即数#immed8相加,结果保存在寄
存器Rd中,不更新寄存器APSR中的标志。下面的指令
ADD R0, PC, #0x04
将PC寄存器的内容和立即数0x04相加,结果保存在寄存器R0中,
不更新寄存器APSR中的标志。注: 该立即数#immed8的范围为0x00000000~0x000003FF,
且#immed8%4=0。7. ADR ,该指令将PC寄存器的内容与标号所表示的偏移量进行相加,结果
保存在寄存器Rd中,不更新APSR中的标志。下面的指令
ADR R3, JumpTable
将JumpTable的地址加载到寄存器R3中。注: 标号必须是字对齐,且范围在0~1020个字节内,可以在汇编
语言中使用ALIGN命令实现标号的字对齐。3.8.2减法指令1. SUBS , ,
该指令将寄存器Rn的内容减去寄存器Rm的内容,结果保存在Rd
中,并且更新寄存器APSR寄存器中的N、Z、C和V标志。下面的
指令
SUBS R0, R1, R2
将寄存器R1的内容减去寄存器R2的内容,结果保存在R0中,并且
更新寄存器APSR寄存器中的标志。2. SUBS , , #immed3该指令将Rn寄存器的内容和立即数#immed3该立即数的范围为
000~111相减,结果保存在寄存器Rd中,并且更新寄存器APSR
中的N、Z、C和V标志。下面的指令
SUBS R0, R1, #0x01
将R1寄存器的内容和立即数0x01相减,结果保存在寄存器R0中,
并且更新寄存器APSR中的标志。3. SUBS , #immed8该指令将Rd寄存器的内容和立即数#immed8该立即数的范围为
00000000~11111111相减,结果保存在寄存器Rd中,并更新寄
存器APSR中的N、Z、C和V标志。下面的指令
SUBS R0, #0x01
将R0寄存器的内容和立即数0x01相减,结果保存在寄存器R0中,
并且更新寄存器APSR中的标志。4. SBCS , , 该指令将Rd寄存器的内容、Rm寄存器的内容和借位标志相减,结
果保存在寄存器Rd中,并且更新寄存器APSR中的N、Z、C和V标
志。下面的指令
SBCS R0, R0, R1
将R0寄存器的内容、R1寄存器的内容和借位标志相减,结果保存
在寄存器R0中,并且更新寄存器APSR中的标志。5. RSBS , , #0该指令用数字0减去寄存器Rm中的内容,结果保存在寄存器Rd中
,并且更新寄存器APSR中的N、Z、C和V标志。下面的指令
RSBS R0, R0, #0
用数字0减去寄存器R0中的内容,结果保存在寄存器R0中,并且
更新寄存器APSR中的标志。3.8.3乘法指令MULS , ,
该寄存器将寄存器Rm的内容和寄存器Rd的内容相乘,结果保存在
Rd寄存器中,并且更新寄存器APSR中的N、Z、C和V标志。下面
的指令
MULS R0, R1, R0
将寄存器R1的内容和寄存器R0的内容相乘,结果保存在R0寄存器
中,并且更新寄存器APSR中的标志。3.8.4比较指令1. CMP ,
该指令比较寄存器Rn和寄存器Rm的内容,得到Rn-Rm的结果
,但不保存该结果,并且更新寄存器APSR中的N、Z、C和V标志
。下面的指令
CMP R0, R1
比较寄存器R0和寄存器R1的内容,得到R0-R1的结果,但不保
存该结果,并且更新寄存器APSR中的标志。2. CMP , #immed8该指令将寄存器Rn的内容和立即数#immed8其范围为
0x00000000~0x000000FF进行比较,得到Rn-#immed8的结
果,但不保存该结果,并且更新寄存器APSR中的N、Z、C和V标
志。下面的指令
CMP R0, #0x01
将寄存器R0的内容和立即数#0x01进行比较,得到R0-0x01的结
果,但不保存该结果,并且更新寄存器APSR中的标志。3. CMN , 该指令比较寄存器Rn的内容和对寄存器Rm取反后内容,得到
Rn Rm的结果,但不保存该结果,并且更新寄存器APSR中的
N、Z、C和V标志。下面的指令
CMN R0, R1
比较寄存器R0和对寄存器R1取反后的内容,得到R0 R1的结
果,但不保存该结果,并且更新寄存器APSR中的标志。思考与练习39: 将保存在寄存器R0和R1内的64位整数,与保
存在寄存器R2和R3内的64位整数相加,结果保存在寄存器R0和
R1中。使用ADDS和ADCS指令实现该64位整数的相加功能。思考与练习310: 将保存在寄存器R1、R2和R3内的96位整数
,与保存在寄存器R4、R5和R6内的96位整数相减,结果保存在
寄存器R4、R5和R6中。使用SUBS和SBCS指令实现该96位整数
的相减功能。3.9逻辑操作指令本节介绍逻辑操作指令,下面对这些指令进行详细说明。1. ANDS , 该指令将寄存器Rd和寄存器Rm中的内容做逻辑与运算,结果
保存在寄存器Rd中,并且更新寄存器APSR中的N和Z标志。下面
的指令
ANDS R0, R1
将寄存器R0和寄存器R1中的内容进行逻辑与运算,结果保存
在寄存器R0中,并且更新寄存器APSR中的标志。2. ORRS , 该指令将寄存器Rd和寄存器Rm中的内容进行逻辑或运算,结
果保存在寄存器Rd中,并且更新寄存器APSR中的N和Z标志。下
面的指令
ORRS R0, R1
将寄存器R0和寄存器R1中的内容进行逻辑或运算,结果保存
在寄存器R0中,并且更新寄存器APSR中的标志。3. EORS, 该指令将寄存器Rd和寄存器Rm中的内容进行逻辑异或运算,
结果保存在寄存器Rd中,并且更新寄存器APSR中的N和Z标志。
下面的指令
EORS R0, R1
将寄存器R0和寄存器R1中的内容进行逻辑异或运算,结果保
存在寄存器R0中,并且更新寄存器APSR中的标志。4. MVNS , 该指令将寄存器Rm的[31∶0]位按位进行逻辑取反运算,
结果保存在寄存器Rd中,并且更新寄存器APSR中的N和Z标志。
下面的指令
MVNS R0, R1
将寄存器R1的[31∶0]位按位进行逻辑取反运算,结果保存
在寄存器R0中,并且更新寄存器APSR中的标志。5. BICS , 该指令将寄存器Rm的[31∶0]位按位进行逻辑取反运算,
然后与寄存器Rd中的[31∶0]位进行逻辑与运算,结果保存
在寄存器Rd中,并且更新寄存器APSR中的N和Z标志。下面的指

BICS R0, R1
将寄存器R1的[31∶0]位按位进行逻辑取反运算,然后与寄
存器R0中的[31∶0]位进行逻辑与操作,结果保存在寄存器
R0中,并且更新寄存器APSR中的标志。6. TST, 该指令将寄存器Rd和寄存器Rm中的内容进行逻辑与运算,但
是不保存结果,并且更新寄存器APSR中的N和Z标志。下面的指令
TST R0, R1
将寄存器R0和寄存器R1中的内容进行逻辑与运算,但是不保
存结果,并且更新寄存器APSR中的标志。思考与练习311: 说明下面指令所实现的功能。1 ANDS R2, R2, R1 2 ORRS R2, R2, R5 3 ANDS R5, R5, R8 4 EORS R7, R7, R6 5 BICS R0, R0, R13.10移位操作指令本节介绍右移和左移操作指令,下面对这些指令进行详细介绍。3.10.1右移指令1. ASRS ,
该指令执行算术右移操作。将保存在寄存器Rd中的数据向右移动
Rm所指定的次数,移位的结果保存在寄存器Rd中,即
Rd=RdRm。在右移过程中,最后移出去的位保存在寄存器
APSR的C标志中,同时更新N和Z标志。在算术右移时,最高位的
规则如图3.2a所示。下面的指令
ASRS R0, R1
将保存在寄存器R0中的数据向右移动R1所指定的次数,移位的结
果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄
存器APSR的C标志中,同时更新N和Z标志。
图3.2算术和逻辑右移操作
2. ASRS , , #immed5该指令执行算术右移操作。将保存在寄存器Rm中的数据向右移动
立即数#immed5所指定的次数范围为1~32,移位的结果保存在
寄存器Rd中,即Rd=Rm#immed5。在右移过程中,最后移出
去的位保存在寄存器APSR的C标志中,同时更新N和Z标志。下面
的指令
ASRS R0, R1,#0x01
将保存在寄存器R1中的数据向右移动1次,移位的结果保存在寄存
器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C
标志中,同时更新N和Z标志。3. LSRS , 该指令执行逻辑右移操作。将保存在寄存器Rd中的数据向右移动
Rm所指定的次数,移位的结果保存在寄存器Rd中,即
Rd=RdRm。在右移过程中,最后移出去的位保存在寄存器
APSR的C标志中,同时更新N和Z标志。在逻辑右移时,最高位的
规则如图3.2b所示。下面的指令
LSRS R0, R1
将保存在寄存器R0中的数据向右移动R1所指定的次数,移位的结
果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄
存器APSR的C标志中,同时更新N和Z标志。4. LSRS , , #immed5该指令执行逻辑右移操作。将保存在寄存器Rm中的数据向右移动
立即数#immed5所指定的次数范围为1~32,移位的结果保存在
寄存器Rd中,即Rd=Rm#immed5。在右移过程中,最后移出
去的位保存在寄存器APSR的C标志中,同时更新N和Z标志。下面
的指令
LSRS R0, R1, #0x01
将保存在寄存器R1中的数据向右移动1次,移位的结果保存在寄存
器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C
标志中,同时更新N和Z标志。5. RORS , 该指令执行循环右移操作。将保存在寄存器Rd中的数据向右循环
移动Rm所指定的次数,移位的结果保存在寄存器Rd中。在循环右
移过程中,最后移出去的位保存在寄存器APSR的C标志中,同时
更新N和Z标志。循环右移的规则如图3.3所示。
图3.3循环右移操作
下面的指令
RORS R0, R1
将保存在寄存器R0中的数据向右循环移动R1所指定的次数,移位
的结果保存在寄存器R0中。在循环右移过程中,最后移出去的位
保存在寄存器APSR的C标志中,同时更新N和Z标志。3.10.2左移指令1. LSLS , 该指令执行逻辑左移操作。将保存在寄存器Rd中的数据向左移动
Rm所指定的次数,移位的结果保存在寄存器Rd中,即
Rd=Rd, , #immed5该指令执行逻辑左移操作。将保存在寄存器Rd中的数据向左移动
立即数#immed5所指定的次数范围为1~32,移位的结果保存在
寄存器Rd中,即Rd=Rm,
图3.5REV操作
该指令将寄存器Rm中字节的顺序按逆序重新排列,结果保存在寄
存器Rd中,如图3.5所示。
下面的指令
REV R0, R1
将寄存器中R1的数据逆序重新排列,即{R1[7∶0],R1[15∶8
],R1[23∶16],R1[31∶24]},结果保存在寄存器R0中。2. REV16 , 该指令将寄存器Rm中的内容以半字为边界,半字内的两个字节逆
序重新排列,结果保存在寄存器Rd中,如图3.6所示。
下面的指令
REV16 R0, R1
将寄存器中R1的数据以半字为边界,半字内的字节按逆序重新排
列,即{R1[23∶16],R1[31∶24],R1[7∶0],R1[15∶8
]},结果保存在寄存器R0中。3. REVSH , 该指令将寄存器Rm中的低半字内的两个字节逆序重新排列,结果
保存在寄存器Rd[15∶0]中,对于Rd[31∶16]中的内容由交
换字节后R[7]的内容决定,即符号扩展,如图3.7所示。
图3.6REV16操作
图3.7REVSH操作
下面的指令
REVSH R0, R1
将寄存器中R1的低半字内的两个字节按逆序重新排列,结果保存
在寄存器R0[15∶0]中,对于R0[31∶16]中的内容由交换字
节后R0[7]的内容决定,即符号扩展,表示为
R0=符号扩展{R1[7:0],R1[15:8]}
思考与练习313: 说明下面指令所实现的功能。1 REV R3, R72 REV16 R0, R0 3 REVSH R0, R53.12扩展操作指令本节介绍扩展操作指令,下面对这些指令进行详细说明。1. SXTB , 将寄存器Rm中的[7∶0]进行符号扩展,结果保存在寄存器Rd中
。下面的指令
SXTB R0, R1
将寄存器R1中的[7∶0]进行符号扩展,结果保存在寄存器R0中
,表示为
R0=符号扩展{R1[7∶0]}
2. SXTH , 将寄存器Rm中的[15∶0]进行符号扩展,结果保存在寄存器Rd
中。下面的指令
SXTH R0, R1
将寄存器R1中的[15∶0]进行符号扩展,结果保存在寄存器R0
中,表示为
R0=符号扩展{R1[15:0]}
3. UXTB , 将寄存器Rm中的[7∶0]进行零扩展,结果保存在寄存器Rd中。
下面的指令
UXTB R0, R1
将寄存器R1中的[7∶0]进行零扩展,结果保存在寄存器R0中,
表示为
R0=零扩展{R1[7:0]}
4. UXTH , 将寄存器Rm中的[15∶0]进行零扩展,结果保存在寄存器Rd中
。下面的指令
UXTH R0, R1
将寄存器R1中的[15∶0]进行零扩展,结果保存在寄存器R0中
,表示为
R0=零扩展{R1[15:0]}
思考与练习314: 说明下面指令所实现的功能。1 SXTH R4, R6 2 UXTB R3, R13.13程序流控制指令本节介绍程序流控制指令,下面对这些指令进行详细说明。1. B 该指令表示无条件跳转到label所标识的地址,跳转地址为当前PC
2048字节的范围内。下面的指令
B loop
实现无条件跳转到loop标识的地址。2. B 有条件跳转指令,根据寄存器APSR中的N、Z、C和V标志,跳转
到label所标识的地址。对于下面的指令来说:
BEQ loop
当寄存器APSR寄存器中的标志位Z为1时,将PC值修改为loop标
号所标识的地址值,也就是跳转到标号为loop的位置执行程序。注: 具体条件的表示参考本章第2节所介绍的后缀含义。3. BL 该指令表示跳转和链接,跳转到一个地址,并且将返回地址保存到
寄存器LR中。跳转地址为当前PC16M字节的范围内。该指令通
常用于调用一个子程序或者函数。一旦完成了函数,通过执行指令
BX LR就可以返回。下面的指令
BL functionA
将PC值修改为functionA标号所表示的地址值,寄存器LR的值等
于PC 4。4. BX 该指令表示跳转和交换,跳转到寄存器所指定的地址,根据寄存器
的第0位的值1表示Thumb,0表示ARM,在ARM和Thumb模
式之间切换处理器的状态。下面的指令
BX R0
将PC值修改为R0寄存器内的内容,即PC=R0。5. BLX 跳转和带有交换的链接。跳转到寄存器所指定的地址,将返回地址
保存到寄存器LR中,并且根据寄存器的第0位的值1表示Thumb
,0表示ARM,在ARM和Thumb模式之间切换处理器的状态。下
面的指令
BLX R0
将PC值修改为R0寄存器内的内容,即PC=R0,并且寄存器LR的
值等于PC 4。思考与练习315: 说明下面指令所实现的功能。1 B loopA 2 BL funC 3 BX LR 4 BLX R05 BEQ labelD3.14存储器屏蔽指令本节介绍存储器屏蔽指令,下面对这些指令进行详细说明。1. DMB数据存储器屏蔽指令。在提交新的存储器访问之前,确保已经完成
所有的存储器访问。2. DSB数据同步屏蔽指令。在执行下一条指令前,确保已经完成所有的存
储器访问。3. ISB指令同步屏蔽指令。在执行新的指令前,刷新流水线,确保已经完
成先前所有的指令。3.15异常相关指令本节介绍异常相关指令,下面对这些指令进行详细说明。1. SVC 管理员调用指令,触发SVC异常。下面的指令
SVC #3
表示触发SVC异常,其参数为3。2. CPS该指令修改处理器的状态,使能禁止中断,该指令不会阻塞NMI
和硬件故障句柄。指令如下:
CPSIE 1;使能中断,清除PRIMASK
CPSID 1;禁止中断,设置PRIMASK
3.16休眠相关指令本节介绍休眠相关指令,下面对这些指令进行详细说明。1. WFI该指令等待中断,停止执行程序,直到中断到来或者处理器进入调
试状态。2. WFE该指令等待事件,停止执行程序,直到事件到来由内部事件寄存器
设置或者处理器进入调试状态。3. SEV在多处理环境包括自身中,向所有处理器发送事件。3.17其他指令本节介绍其他指令,下面对这些指令进行详细说明。1. NOP该指令为空操作指令,该指令用于产生指令对齐,或者引入延迟。2. BKPT 该指令为断点指令,使处理器处于停止阶段。在该阶段,通过调试
器,用户执行调试任务。由调试器插入BKPT指令,以代替原来的
指令。注: immed8表示用于断点的标号,其范围为0x00~0xFF。下面的指令
BKPT #0
表示标号为0的断点。3. YIELD该指令用于表示停止一个任务。在多线程系统中,使用该指令用于
表示延迟当前线程如等待硬件,并且能被交换换出。在Cortex
M0中,作为NOP执行,即与NOP一样。3.18数据插入和对齐操作本节介绍在程序中插入数据以及对齐数据的方法。1. 使用下面的语句在程序中插入数据1 DCD表示插入一个字数据32位。2 DCB表示插入一个字节数据8位。2. 使用ALIGN用于对齐数据1 在插入一个字数据之前使用它。2 使用一个数据来确定对齐的大小。如:
ALIGN4;对齐到字边界
MY_DATADCD 0x12345678 ;插入一个字数据
MY_STRINGDCB "Hello",0;插入一个字符串,0表示字符
串的结束

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.