打印
[应用相关]

指令集及cortex——m3的存储系统

[复制链接]
2017|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
略略u|  楼主 | 2024-3-31 16:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
汇编语言基础

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

  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指令可以按半字节对齐。



使用特权

评论回复
沙发
略略u|  楼主 | 2024-3-31 16:06 | 只看该作者
四、指令集

  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位数据操作指令

使用特权

评论回复
板凳
略略u|  楼主 | 2024-3-31 16:06 | 只看该作者
   2)、16位转移指令

使用特权

评论回复
地板
略略u|  楼主 | 2024-3-31 16:06 | 只看该作者
   3)、16位存储器数据传送指令

使用特权

评论回复
5
略略u|  楼主 | 2024-3-31 16:06 | 只看该作者
4)、其他16位指令

使用特权

评论回复
6
略略u|  楼主 | 2024-3-31 16:06 | 只看该作者
  5)、32位数据操作指令




使用特权

评论回复
7
略略u|  楼主 | 2024-3-31 16:07 | 只看该作者
32位存储器数据传送指令


使用特权

评论回复
8
略略u|  楼主 | 2024-3-31 16:07 | 只看该作者
32位转移指令

使用特权

评论回复
9
略略u|  楼主 | 2024-3-31 16:41 | 只看该作者
其他32位指令


使用特权

评论回复
10
略略u|  楼主 | 2024-3-31 16:42 | 只看该作者
未支持的指令

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

使用特权

评论回复
11
略略u|  楼主 | 2024-3-31 16:42 | 只看该作者
不支持的协处理器相关指令

不支持的CPS指令用法




不支持的hint指令

使用特权

评论回复
12
略略u|  楼主 | 2024-3-31 16:43 | 只看该作者
近距离的检视指令

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

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

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

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

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

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



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



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

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

使用特权

评论回复
13
略略u|  楼主 | 2024-3-31 16:44 | 只看该作者
如果想一次性的解决存储器访问问题,可以使用LDM/STM来进行,它相当于把若干个LDR/STR给合并起来。



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

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

使用特权

评论回复
14
略略u|  楼主 | 2024-3-31 16:44 | 只看该作者
    III、Cortex-CM3还支持后索引。后索引也要使用一个立即数offset,但与预索引不同的是,后索引是忠实使用基址寄存器Rd的值作为数据传送的地址的。

使用特权

评论回复
15
略略u|  楼主 | 2024-3-31 16:44 | 只看该作者
待到数据传输之后,

           在执行Rd<-Rd+offset。

使用特权

评论回复
16
略略u|  楼主 | 2024-3-31 16:44 | 只看该作者
LDR伪指令 VS ADR伪指令

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

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

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

使用特权

评论回复
17
略略u|  楼主 | 2024-3-31 16:44 | 只看该作者
汇编语言:数据处理

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

        对APSR的更新。

使用特权

评论回复
18
略略u|  楼主 | 2024-3-31 16:45 | 只看该作者
常见的算术四则运算指令

使用特权

评论回复
19
略略u|  楼主 | 2024-3-31 16:45 | 只看该作者
Cortex-CM3还片载了硬件乘法器,支持乘加/乘减运算,并能产生64位的值。

使用特权

评论回复
20
略略u|  楼主 | 2024-3-31 16:45 | 只看该作者
逻辑运算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

603

帖子

0

粉丝