一文详解Arm Cortex-M处理器指令集

发布者:xinyi9008最新更新时间:2023-05-24 来源: elecfans关键字:Arm  Cortex-M  处理器  指令集 手机看文章 扫描二维码
随时随地手机看文章

Arm处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,具有32位Arm指令集和16位Thumb指令集,Arm指令集效率高,但是代码密度低,而Thumb指令集具有更好的代码密度,却仍然保持Arm的大多数性能上的优势,它是Arm指令集的子集。所有Arm指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。Arm程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。



Cortex-M0处理器基于ARMv6-M架构,是一款功耗和性能较为均衡的处理器。Cortex-M0只支持56条指令的小指令集,其中大部分指令是16位指令。


Arm Cortex-M 指令集对比:


db60bce8-d57d-11ec-bce3-dac502259ad0.png


1. 指令集

1.1 在处理器内移动数据

MOV,;RmandRncanbehighorlowregisters. MOVS, MOVS,#immed8;8位立即数值 MRS, MSR,


1.2 存储器访问

确保访问的内存地址是对齐的,这一点很重要。在ARMv6-M架构(包括Cortex-M0和Cortex-M0处理器)上不支持非对齐传输。任何未对齐内存访问的尝试都会导致HardFault异常。


LDR,[,];Rt=memory[Rn+Rm] STR,[,];memory[Rn+Rm]=Rt LDRH,[,];Rt=memory[Rn+Rm] STRH,[,];memory[Rn+Rm]=Rt LDRB,[,];Rt=memory[Rn+Rm] STRB,[,];memory[Rn+Rm]=Rt LDRSH,[,];Rt=SignExtend(memory[Rn+Rm]) LDRSB,[,];Rt=SignExtend(memory[Rn+Rm]) LDR,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5<<2)] STR  ,[,#immed5];memory[Rn+ZeroExtend(#immed5<<2)] = Rt LDRH ,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5<<1)] STRH ,[,#immed5];memory[Rn+ZeroExtend(#immed5<<1)] = Rt LDRB ,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5)]STRB,[,#immed5];memory[Rn+ZeroExtend(#immed5)]=Rt LDR,[SP,#immed8];Rt=memory[SP+ZeroExtend(#immed8<<2)] STR  ,[SP,#immed8];memory[SP+ZeroExtend(#immed8<<2)] = Rt LDR  ,[PC,#immed8];Rt=memory[WordAligned(PC+4)+ZeroExtend(#immed8<<2)] LDR  ,=immed32;pseudoinstructiontranslatedtoLDR,[PC,#immed8] LDR,label;pseudoinstructiontranslatedtoLDR,[PC,#immed8] LDM,{,,..};LoadMultiple //Ra=memory[Rn] //Rb=memory[Rn+4], //... LDMIA!,{,,..};LoadMultipleIncrementAfter LDMFD!,{,,..} //Ra=memory[Rn], //Rb=memory[Rn+4], //... //andthenupdateRntolastreadaddressplus4. STMIA!,{,,..};StoreMultipleIncrementAfter STMEA!,{,,..} //memory[Rn]=Ra, //memory[Rn+4]=Rb, //... //andthenupdateRntolaststoreaddressplus4.


1.3 栈空间访问

PUSH{,,..} PUSH{,,..,LR} POP{,,..} POP{,,..,PC}


1.4 算数运算

ADD,;Rd=Rd+Rm.Rd,Rmcanbehighorlowregisters. ADDS,,;Rd=Rn+Rm SUBS,,;Rd=Rn–Rm ADDS,,#immed3;Rd=Rn+ZeroExtend(#immed3) SUBS,,#immed3;Rd=Rn–ZeroExtend(#immed3) ADDS,#immed8;Rd=Rd+ZeroExtend(#immed8) SUBS,#immed8;Rd=Rd–ZeroExtend(#immed8) ADCS,,;Rd=Rd+Rm+Carry SBCS,,;Rd=Rd–Rm–Borrow ADDSP,SP,#immed7;SP=SP+ZeroExtend(#immed7<<2) SUB  SP, SP, #immed7     ; SP = SP – ZeroExtend(#immed7<<2) ADD  SP, ;SP=SP+Rm.Rmcanbehighorlowregister. ADD,SP,;Rd=Rd+SP.Rdcanbehighorlowregister. ADD,SP,#immed8;Rd=SP+ZeroExtend(#immed8<<2) ADD  ,PC,#immed8;Rd=(PC[31:2]<<2) + ZeroExtend(#immed8<<2) ADR  ,;pseudoinstructiontranslatedtoADD,PC,#immed8 RSBS,,#0;Rd=0–Rm,ReverseSubtract(negative) MULS,,;Rd=Rd*Rm CMP,#immed8;Rd–ZeroExtended(#immed8) CMP,;Rn–Rm CMN,;Rn–NEG(Rm)


1.5 逻辑运算

ANDS,,;Rd=AND(Rd,Rm) ORRS,,;Rd=OR(Rd,Rm) EORS,,;Rd=XOR(Rd,Rm) BICS,,;Rd=AND(Rd,NOT(Rm)) MVNS,;Rd=NOT(Rm) TST,;AND(Rn,Rm)


1.6 移位和循环操作

ASRS,,#immed5;Rd=Rm>>immed5 LSLS,,#immed5;Rd=Rm<<#immed5 LSRS ,,#immed5;Rd=Rm>>#immed5ASRS,,;Rd=Rd>>Rm LSLS,,;Rd=Rd<,,;Rd=Rd>>RmRORS,,;Rd=RdrotaterightbyRmbits //Rotate_Left(Data,offset)=Rotate_Right(Data,(32-offset))


1.7 展开和顺序反转操作

这些反向指令通常用于在小端和之间转换数据大整数。


REV,;Byte-ReverseWord //Rd={Rm[7:0],Rm[15:8],Rm[23:16],Rm[31:24]} REV16,;Byte-ReversePackedHalfWord //Rd={Rm[23:16],Rm[31:24],Rm[7:0],Rm[15:8]} REVSH,;Byte-ReverseSignedHalfWord //Rd=SignExtend({Rm[7:0],Rm[15:8]})


1.8 扩展操作

它们通常用于数据类型转换。


SXTB,;SignedExtendedByte //Rd=SignExtend(Rm[7:0]) SXTH,;SignedExtendedHalfWord //Rd=SignExtend(Rm[15:0]) UXTB,;UnsignedExtendedByte //Rd=ZeroExtend(Rm[7:0]) UXTH,;UnsignedExtendedHalfWord //Rd=ZeroExtend(Rm[15:0])


1.9 程序流控制

B;Branch,Branchrangeis±2046bytesofcurrentPC B;ConditionalBranch,Branchrangeis±254bytesofcurrentPC BL;BranchandLink,Branchrangeis±16MBofcurrentPC BX;BranchandExchange BLX;BranchandLinkwithExchange


条件转移指令B


db77bb32-d57d-11ec-bce3-dac502259ad0.png


1.10 内存屏障指令

在Cortex-M0和Cortex-M0处理器上支持内存屏障指令,从而在Cortex-M处理器和其他ARM处理器家族中提供更好的兼容性。


//数据内存屏障,确保所有内存访问都完成 //在新的内存访问被提交之前。


DMB


//数据同步屏障,确保所有的内存访问都完成 //在执行下一条指令之前。


DSB


//指令同步障碍,刷新管道和 //确保之前所有的指令都已完成 //在执行新指令之前。


ISB


1.11 异常相关指令

SVC ; Supervisor call CPSIE I ; Enable Interrupt (Clearing PRIMASK) CPSID I ; Disable Interrupt (Setting PRIMASK)


1.12 睡眠模式功能相关说明

//等待中断,停止程序执行,直到一个中断到达, //如果处理器进入调试状态。


WFI


//等待事件,如果设置了内部事件寄存器,则清除 //内部事件注册和继续执行。 //停止程序执行,直到事件(如中断)到达 //如果处理器进入调试状态。


WFE


//发送事件,设置本地事件寄存器并发送一个事件脉冲 //多处理器系统中的其他微处理器。


SEV


1.13 其他说明

NOP;NoOperation BKPT;Breakpoint YIELD;ExecuteasNOPontheCortex-M0processor


2. 指令说明

2.1 可访问high registers的指令

绝大部分指令只能访问low registers,也就是只能访问R0~R7寄存器。可以访问high registers的指令只有两条,这两条指令都不更新APSR,指令没有S后缀。


MOV,;RmandRncanbehighorlowregisters. ADD,;Rd=Rd+Rm.Rd,Rmcanbehighorlowregisters.


其它两条和SP加法有关的可以访问high registers的指令其本质是ADD指令。


ADDSP, ADD,SP,


2.2 分配临时变量的指令

函数内的临时变量分配到堆栈,进入函数给临时变量分配空间时使用SUB指令。


SUB SP, SP, #immed7 ; SP = SP – ZeroExtend(#immed7<<2)


退出函数释放临时变量空间时使用ADD指令。


ADD SP, SP, #immed7 ; SP = SP + ZeroExtend(#immed7<<2)


上面两条指令的立即数只有7位,最多可以增减SP指针127个字空间,如果超过127个字,使用这条指令:


ADD SP, ; SP = SP + Rm. Rm can be high or low register.


只有ADD指令,没有SUB指令,如果需要SUB,那么给Rm赋值负数即可。


2.3 取临时变量地址的指令

在堆栈分配了临时变量空间后,总要取得临时变量的地址才能做进一步的操作。


ADD , SP, #immed8 ; Rd = SP + ZeroExtend(#immed8<<2)


立即数不够,可以用寄存器。


ADD , SP, ; Rd = Rd + SP. Rd can be high or low register.


2.4 RSBS指令

RSBS , , #0 ; Rd = 0 – Rm, Reverse Subtract (negative)


这是倒过来的减法,常量减去寄存器值,而且常量只能是0。所以这条指令实质上就是一条取负数指令。


Rd = 0 - Rm 等价于:Rd = -Rm Rd 寄存器值等于负的 Rm 寄存器值。


关键字:Arm  Cortex-M  处理器  指令集 引用地址:一文详解Arm Cortex-M处理器指令集

上一篇:一个超级实用的单片机调试组件!
下一篇:基于CAN总线的运动控制系统设计

推荐阅读最新更新时间:2024-11-24 18:02

珠海炬力:以次核心竞争力实现本土创新
  在很多MP3制造商眼里,珠海炬力如同在PC制造商眼里的Intel,如果哪天看见一款MP3机壳上贴着Actions Inside的标签,相信也不会令同行有多惊讶——这家MP3处理器供应商的发展实在太快,用炬力全球策略总监李强的话来说,是“次核心竞争力”造就了炬力的成功。   MP3处理器是一个成熟市场,在此类市场要体现竞争力面临着多种挑战。李强认为,成熟市场产品的竞争力会体现在这两个方面,第一是规模和成本控制能力,第二是差异化的能力。而能够设计出具有差异化的IC产品是一个IC设计公司首先应该具有的核心竞争力。其次,要能够准确定义产品的开发方向。企业需要具备两个能力:一是芯片的设计和量产能力;二是次核心竞争力,即商业化的能力。
[焦点新闻]
英特尔大小核处理器 Lakefield,CPU 强大,但 GPU 效能恐成弱项
虽然,处理器大厂英特尔 (intel) 在移动处理器上的发展并不顺利。不过,英特尔对移动市场却还没有完全的彻底放弃。因为外媒报导,英特尔将使用 10 纳米制程生产一款代号为 Lakefield 的单芯片处理处理器,导入了 ARM 处理器的 bigLITTLE 大小核架构设计,这将使得称这款单芯片处理器的 CPU 效能强过高通的处理器。 报导指出,ARM 的 bigLITTLE 大小核设计架构就是 CPU 内部有高性能核心,也有低功耗核心,针对不同的应用情况调动不同的核心,以便达到性能与功耗的平衡的目的。目前包括高通骁龙 845 及 835、华为的麒麟 960 及 970、联发科的 Helio 系列处理器都应用了 bigLITT
[半导体设计/制造]
ARM Linux中断源码分析(1)——中断初始化与注册
1.中断和异常 中断可分为同步(synchronous)中断和异步(asynchronous)中断: (1)同步中断又称为异常,是当指令执行时由CPU控制单元产生,之所以称为同步,是因为只有在一条指令执行完成后CPU才会发出中断。典型的异常有缺页和除0。 (2)异步中断是指由其他硬件设备依照CPU时钟信号随机产生。 1.1 ARM异常与向量表 当一个异常或中断发生时,处理器会把pc设置为一个特定的存储器地址。这个地址放在一个被称为向量表(vector table)的特定的地址范围内。向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。 存储器映射地址0x00000000是为向量表保留的。在有些处理器中,向
[单片机]
<font color='red'>ARM</font> Linux中断源码分析(1)——中断初始化与注册
ARM2200 下的中断编程三
一.在uc/os操作系统上设计中断函数时所要考虑的一些问题: 1 .操作系统本身必须使用一个定时器中断源来作为系统节拍中断,它是操作系统工作的基础。 2.只要没有关闭中断,中断服务程序就可以中断任何任务的运行,所以将中断服务程序看成比最高优先级(0)级的任务还要高的任务。 3.中断服务程序的功能应该尽量简单,只要将获取的异步事件通信给关联任务即可,后续处理由其关联任务完成。 4.实时操作系统UC/OS移植到ARM7体系的CPU上时,没有对FIQ 进行处理,即FIQ是不受操作系统管理的。由于没有操作系统介入,FIQ的ISR无法与关联任务进行通信,所获取的信息不能及时得到关联任务的处理,故只能以原始形式保存在一个缓冲区内,等待以后进
[单片机]
<font color='red'>ARM</font>2200 下的中断编程三
S3c2440ARM异常与中断体系详解8---定时器中断程序示例
这节课我们来写一个定时器的中断服务程序 使用定时器来实现点灯计数 查考资料就是第10章PWM TIMER 我们先把这个结构图展示出来 这个图的结构很好 这里面肯定有一个clk(时钟), 1 、每来一个clk(时钟)这个TCNTn减去1 2、 当TCNTn == TCMPn时,可以产生中断,也可以让对应的SPWM引脚反转,(比如说原来是高电平,发生之后电平转换成低电平) 3、 TCNTn继续减1,当TCNTn == 0时,可以产生中断,pwm引脚再次反转 TCMPn 和 TCNTn的初始值来自TCMPBn,TCNTBn 4 、TCNTn == 0时,可自动加载初始 怎么使用定时器? 1、 设置时钟 2 、设置初值 3
[单片机]
S3c2440<font color='red'>ARM</font>异常与中断体系详解8---定时器中断程序示例
基于ARM-WinCE的视频监控系统分析
设计一种嵌入式系统,以WinCE操作系统和ARM硬件平台为核心实现对现场的实时监控;通过无线网络把视频图像传输到主机端,以实现分析、存储及显示等功能。 数字视频监控系统是以计算机或嵌入式系统为中心、视频处理技术为基础组建的的一种新型监控系统,系统采用符合图像数据压缩的国际标准,综合利用图像传感器、计算机网络、自动控制和人工智能等技术。由于数字视频监控系统对视频图像进行了数字化,所以与传统的模拟监控系统相比,数字监控具有许多优点。数字化的视频系统可以充分利用计算机的快速处理能力,对其进行压缩、分析、存储和显示。 数字化视频处理技术提高了图像的质量与监控效率,使系统易于管理和维护。整个系统是模块化结构,体积小,易于安装、使用和
[单片机]
基于<font color='red'>ARM</font>-WinCE的视频监控系统分析
基于ARM的嵌入式USB图像采集与显示
   引言   目前市场上大部分的图像采集与处理系统是基于DSP 芯片的,这种图像采集与处理系统成本高、功耗高、体积约束等特点并不适用于一些简单的应用。随着USB 摄像头的普及和基于ARM 的嵌入式芯片的快速发展,将二者结合的便携性越来越受人们欢迎。本文介绍了一种基于三星S3C2440A 芯片的嵌入式USB 摄像头图像采集与显示方案,该方案具有良好的可移植性和扩展性,并且成本、大小和实时处理都能够满足市场需求。   1 系统架构   系统通过当前市场上应用最广泛的中芯微公司生产的zc301p 芯片的USB 摄像头进行图像采集,然后将图像信息传送到ARM 芯片中进行处理,最终通过基于Qt/Embedded 编写的图形显示程序在
[单片机]
基于<font color='red'>ARM</font>的嵌入式USB图像采集与显示
魅族16与三星Note9扎堆发布 同款处理器价格差三倍
     hello大家好,又到了我们周周机情侃的时间了,本周手机圈最重磅的要数魅族16和三星Note 9这两款新机的推出了。魅族与三星这两款旗舰手机分别在8月8日和8月9日接踵而至,虽然用的都是骁龙845的处理器,但价格却足足差了好几倍。 说起来,魅族与三星都是前些年比较火的手机了,一个是国际大牌,一个是国产精品,然而,现如今这两大手机品牌却像一对难兄难弟,和风头强劲的华为OV小米相比,他们在中国市场的排名均比较靠后,日子很不好过。因此,新旗舰的发布也被认为是提振市场之作。那么,这两款新机究竟胜算几何呢? 黄章再试牛刀 打磨最具性价比骁龙845新机 魅族创始人黄章可以说是魅族的灵魂人物,每隔几年时运不济的时候总要出来“打磨”一款
[手机便携]

推荐帖子

从USB接口捕获数据的问题
先描述一下问题吧:现在有一个USB设备,有驱动盘的。需要做一个客户端程序来捕获该设备通过USB传送过来的数据。也就是完成驱动和客户软件的通信,但是现在无法看到驱动程序的内部,有没有什么好的办法?希望可以有API可以协助该程序的实现,由于是第一次涉及USB接口的数据传输,找了一些相关的东西都不太对,有这方面经验的朋友帮帮忙吧,谢谢!从USB接口捕获数据的问题首先,你可以在微软官方网站下载DDK,现在最新版本是WDK(6000版本)。你可以先用里面的usbview.exe观察你的
zeng_jinliang 嵌入式系统
如何分辨FPC柔性线路板好坏
判断FPC电路板的好坏的方法:  第一:从外观上分辨出电路板的好坏  一般情况下,FPC线路板外观可通过三个方面来分析判断;  1、大小和厚度的标准规则。  线路板对标准电路板的厚度是不同的大小,客户可以测量检查根据自己产品的厚度及规格。  2、光和颜色。  外部电路板都有油墨覆盖,线路板能起到绝缘的作用,如果板的颜色不亮,少点墨,保温板本身是不好的。  3、焊缝外观。  线路板由于零件较多,如果焊接不好,零件易脱落的线路板,严
方学放 PCB设计
TI电源管理芯片多输出参考设计,,参考一下!
VIN(V)VOUT(V)IOUT(A)器件说明参考设计0.8-3.31.5-5.50.2TPS61100双路输出、可调节3.3V单节升压转换器和可调节1.5VLDOTPS61100REF-1981.5-7.00.9-3.60.270.8-3.33.30.2TPS61103双路输出、固定3.3V单节升压转换器和可调节1.5V
qwqwqw2088 模拟与混合信号
An unspecified Debug Toolbox call failed
我在使用ADS1.2套件的AXD时,连接了Easyjtag,并进行了设置,但是却出现了如题的AnunspecifiedDebugToolboxcallfailed的错误,请高人指点,该如何解决这个问题?AnunspecifiedDebugToolboxcallfailed我也遇到这个问题,用H-JTAG可以在RAM里调试程序,但是用EasyJtag下载到外扩flash就出现这个问题
koujuan 嵌入式系统
DMA传输中的tile配置是什么意思?
如题,在DMAoutput的设置中发现有line,16X16tile等可以选择。不太明白这种tile配置是怎样工作的,那位比较了解请帮忙讲解一下。DMA传输中的tile配置是什么意思?ding.帖子沉的太快了。帮顶下。MARK,期待高手,我也学习下。下面的就当做抛砖引玉吧:line与16X16tile应该理解为DMA的输出方式…还是觉得不如自己Debug来的实在,我是小菜也不懂,提供DMA的工作原理供参考:直接存储存取方式(DMA)是在存储器与I/O设备间直接传送数据,
xiangyata 嵌入式系统
这5本书,你想让哪一本先上线?快来给它投票啦~
书籍简介:实战AI大模型(人工智能专家尤洋力作,周鸿祎、颜水成、李开复推荐)作者:尤洋《实战AI大模型》是一本旨在填补人工智能(AI)领域(特别是AI大模型)理论与实践之间鸿沟的实用手册。书中介绍了AI大模型的基础知识和关键技术,如Transformer、BERT、ALBERT、T5、GPT系列、InstructGPT、ChatGPT、GPT4、PaLM和视觉模型等,并详细解释了这些模型的技术原理、实际应用以及高性能计算(HPC)技术的使用,如并行计算和内存优化。同时,《实
nmg 测评中心专版
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved