STM32学习之路入门篇之指令集及cortex——m3的存储系统

2019-12-03来源: eefocus关键字:STM32  指令集  cortex——m3  存储系统

一、汇编语言基础

一)、汇编语言:基本语法

  1、汇编指令最典型的书写模式:

        标号

                   操作码        操作数1, 操作数2,... ;注释

   1)、标号是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移的地址。

   2)、操作码是指令的助记符,它的前面必须有至少一个空白符,通常使用提个Tab键来产生。

   3)、操作码后面往往跟若干个操作数,而第一个操作数,通常都给出本指令执行结果的存储地。不同指令需要不同数目的操作数,并且对操作数的语法要求也可以不同。

   4)、注释均以;开头,它的有无不影响汇编操作,只是给程序员看的,让程序员更加可以理解代码。

 

  2、可以使用EQU指示子来定义常数,也可以使用DCB来定义一串字节常数——允许以字符串的形式表达,还可以使用DCD来定义一串32位整数。

 

  3、如果汇编器不能识别某些特殊指令的助记符,就需要“手工汇编”,查出该指令的确切二进制机器码,然后使用DCI编译器指示器。

 

  4、不同汇编器的指示字和语法都可以不同。以上以ARM汇编器说明,如使用其他汇编器,细看说明和实例代码。


二)、汇编语言:后缀的使用

  1、在ARM处理器中,指令可以带有后缀的:

 

  2、在Cortex-CM3中,对条件后缀的使用有限制,只有转移指令(B指令)才可以随意使用。而对于其他指令,Cortex-CM3引入IF-THEN模块,在这个块中才可以加后缀,且必须加后缀。

 

 三)、汇编语言:统一的汇编语言

  1、为了有力支持Thumb-2,引入了一个“统一汇编语言(UAL)”语法机制。对于16位指令和32位指令均能实现一些操作,有时虽然指令的实际操作数不同,或者对立即数的长度有不同的限制,但是汇编器允许开发者以相同的语法格式编写,并且由汇编器来决定使用16位指令还是32位指令。

 

  2、如果使用了传统的Thumb语法有些指令会默认更新APSR,即使你没有加上S后缀。如果使用UAL语法,则必须使用S后缀才能更新。

 

  3、在Thumb-2指令集中,有些操作既可以由16位指令完成,也可以由32位指令完成。在UAL下,可以让编译器决定用哪个,也可以手工指令使用16位还是32位。

   1)、.W后缀指定32位指令。如果没有给出后缀,会bain其会先试着用16位指令以缩小代码体积如果不行在使用32位指令。

   2)、.N后缀指定16位指令。

 

  4、32位Thumb-2指令可以按半字节对齐。

 

四、指令集

  1、APSR中的5个标识位:

   1)、N:复数表示(Negative)。

   2)、Z:零结果标识(Zero)。

   3)、C:进位/借位标识(Carry)。

   4)、V:溢出标识(oVerflow)。

   5)、S:饱和标识(Saturation),它不做条件转移的依据。

 

  2、Cortex-CM3支持的指令集如下:

    注意:边框双粗的是从ARMv6T2才支持的指令。

    双线边框的是从Cortex-CM3才支持的指令,(v7的其他款式不一定支持)。

   1)、16位数据操作指令

   2)、16位转移指令

   3)、16位存储器数据传送指令

   4)、其他16位指令

   5)、32位数据操作指令

   6)、32位存储器数据传送指令

   7)、32位转移指令

   8)、其他32位指令

 

  3、未支持的指令

   1)、不再是传统的架构,呆滞某些指令已失去意义

   2)、不支持的协处理器相关指令

   3)、不支持的CPS指令用法

   4)、不支持的hint指令

  

 

五、近距离的检视指令

 一)、汇编语言:数据传送

  1、Cortex-CM3中的数据传输类型

   1)、两个寄存器间的传输数据。

   2)、寄存器与存储器间传输数据。

   3)、寄存器与特殊功能寄存器间传输数据。

   4)、把一个立即数加载到寄存器。

 

  2、用在数据传输的指令时MOV,它的另一个衍生物是MVN——把寄存器的内容取反后再传送。

 

  3、用于访问存储器的基础指令是“加载(load)”和“存储(store)”。

   1)、加载指令LDR把存储器中的内容加载到寄存器中,存储指令STR把寄存器的内容存储到存储器中。传送过程中数据类型也可以变通,最常见的格式有:

   2)、如果想一次性的解决存储器访问问题,可以使用LDM/STM来进行,它相当于把若干个LDR/STR给合并起来。

    I、表中加粗的符合Cortex-CM3堆栈操作的LDM/STM的使用方式。并且如果Rd是R13,则与PUSH和POP等效。

    II、感叹号表示自增或自减基址存储器Rd的值,时机是在每次访问前或访问后。感叹号还可以用于单一加载或存储指令,——LDR/STR。这也就是所谓的“带预索引”的LDR和STR。

    III、Cortex-CM3还支持后索引。后索引也要使用一个立即数offset,但与预索引不同的是,后索引是忠实使用基址寄存器Rd的值作为数据传送的地址的。待到数据传输之后,在执行Rd<-Rd+offset。

 

  4、LDR伪指令 VS ADR伪指令

   1)、LDR和ADR都有能力产生一个地址,但是语法和行为不同。

   2)、对于LDR,如果汇编器发生要产生立即数是一个程序地址,它会自动把LSB置位,

   3)、对于ADR相反,它不会修改LSB。

 

 二)、汇编语言:数据处理

  1、虽然助记符都是ADD,但是二进制机器码是不同的。当使用16位加法时会自动更新APSR的标识位。然而,在使用了“.W”显式指定了32位指令后,就可以通过“S”后缀控制对APSR的更新。

 

  2、常见的算术四则运算指令

 

  3、Cortex-CM3还片载了硬件乘法器,支持乘加/乘减运算,并能产生64位的值。

  4、逻辑运算

  5、移位(支持多种组合)运算和循环运算

  6、带符号扩展指令

  7、数据序转指令

  8、位段处理及把玩指令

 三)、汇编语言:子程序呼叫与无条件转移指令

  1、最基本的无条件转移指令有两条:

     B    Label    ;转移到Label处对应的地址

     BL    reg    ;转移到有寄存器reg给出的地址

 

  2、呼叫子程序时,需要保存返回地址,正点的指令是:

     BL    Label    ;转移到Label处对应的地址,并且把转移前的下条指令地址保存到LR

     BLX    reg    ;转移到由寄存器reg给出的地址,根据REG的LSB切换处理器的状态,并且把转移前的下条指令地址保存到LR

   注意:、使用BLX要注意,其改变状态的功能。因此确保reg的lsb必须为1,以确保不会进入ARM状态。

 

  3、以PC为目的寄存器的MOV和LDR指令也可以实现转移,常见的形式有:

     MOV    PC,    R0    ;         转移地址由R0给出

     LDR     PC,    [R0]    ;      转移地址存储在R0所指向的存储器中

     POP    {...,  PC]    ;     把返回地址以弹出堆栈的方式送给PC,从而实现转移

     LDMIA    SP!,     {...,  PC    ;   POP另一种等效写法

   注意:使用这些方式必须保证送给PC的值是奇数(LSB=1)。

 

 四)、标志位与条件指令

  1、在应用程序状态寄存器中有5个标志位,但只有4个被条件转移指令参考。绝大多数ARM的条件转移指令根据他们来决定是否转移。

 

  2、在ARM中数据操作指令可以更新这4个标志位。这些标志位除了可以当条件转移的判断之外,还能再一些场合下作为指令是否执行的依据。或者在移位操作中充当各种中介角色。

 

  3、担任条件转移和条件执行的依据时,这4个标志位既可以单独使用,也可以组合使用,以产生15种判断依据:

 

  4、在Cortex-CM3中,下列指令可以更新PSR的标志:

   1)、16位算术逻辑指令。

   2)、32位带S后缀的算术逻辑指令。

   3)、比较指令和测试指令。

   4)、直接写PSR/APSR(MAR指令)。

 

 五)、汇编语言:指令隔离指令和存储器隔离指令

 六)、汇编指令:饱和运算

  1、Cortex-CM3的饱和运算指令分为两种:带符号的饱和运算以及无符号饱和运算。

 

  2、饱和运算指令

六、Cortex-CM3中一些有用的新指令

  1、MSR和MRS

   1)、这两条指令是访问特殊功能寄存器的指令,必须在特权下访问,出APSR外。

   2)、指令语法如下:

MRS

[1] [2] [3]
关键字:STM32  指令集  cortex——m3  存储系统 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481827.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32学习之路之MDK安装篇
下一篇:STM32总线结构和存储器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
解决STM8类型单片机空间太小,使用不了printf串口打印问题
概述:在使用STM8L101F3这款单片机时,由于它只有8K的flash,空间非常小,只要调用C库函数printf编译后整个文件很大,直接程序溢出。这也就意味着我们实现printf串口打印调试就没办法进行。既然使用不了库函数,那么我们就可以自己动手封装类似printf的函数,这样我们就可以实现数据串口打印啦。这里就直接放上我的STM8L101F3的部分源码了,希望可以给你一些参考。源码:#include "stdarg.h"#include "stm8l10x.h" void USART_Config(void){    /*Set the USART RX
发表于 2019-12-04
解决STM8类型单片机空间太小,使用不了printf串口打印问题
基于STM8的IIC协议--协议篇
4.3.8代码示例。3.6 数据有效性  I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。3.7 I2C通信总过程 4. 例程4.1 编译环境:  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。4.2 主芯片:  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的
发表于 2019-12-04
基于STM8的IIC协议--协议篇
基于STM8的ADC读取---STM8-第四章
和连续转换的扫描模式具有上限和下限门槛的模拟看门狗模拟看门狗时间发生可产生中断----------------------------------------------------------------------------------------------------------------------------------3. 例程3.1 编译环境  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。3.2 主芯片  我的主芯片是STM8S系列中的103
发表于 2019-12-04
基于STM8的ADC读取---STM8-第四章
小广播
何立民专栏 单片机及嵌入式宝典

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

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