嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统2_第1页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统2_第2页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统2_第3页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统2_第4页
嵌入式系统原理与应用 课件 第3章 Cortex M3指令系统2_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统设计西安邮电大学计算机学院王忠民第三章CortexM3指令系统学习目的了解ARMV7架构新引入的Thrum-2指令系统的特点,掌握Thumb-2指令集的编码格式以及ARM汇编语言源程序的组成以及编写规则。掌握基于纯汇编工程的构建方法,掌握启动文件的编写与基本构成,理解中断(异常)向量表的作用。掌握基本的数据型操作数的寻址方式,理解常用的地址型操作数的寻址方式。熟悉算数运算指令、逻辑运算与位操作指令、内部数据传输指令、存储器数据传送指令、比较与测试指令、控制转移指令等中的常用指令的功能,掌握对处理器底层访问、数据处理与控制转移等一些基本指令的使用。学习内容汇编语言基础寻址方式算数运算指令逻辑与位操作指令内部数据传送指令存储器数据传送指令比较与测试指令控制转移指令汇编语言基础寻址方式汇编语言指令系统(1)汇编语言指令系统(2)第三章CortexM3指令系统---学习内容第三章CortexM3指令系统---寻址方式操作数分类:1、数据型操作数2、地址型操作数;绿色为数据型操作数;红色为地址型操作数

LDR R0,=X1

MOV R1,#5

MOV R2,#0

loop1 LDR R3,[R0],#4

ADD R2,R2,R3

SUBS R1,R1,#1

BNE loop1

LDR R0,=X2

STR R2,[R0]

deadloop B deadloop操作数寻址方式的定义:处理器在执行指令时,确定指令中操作数来源的方法。第三章CortexM3指令系统---数据型操作数寻址方式数据型操作数可能来自指令代码、寄存器或存储单元: 1.立即数寻址方式(ImmediateAddressingMode)

---操作数在指令代码中 MOV R0,#0xFF 2.寄存器寻址方式(RegisterAddressingMode)

---操作数在寄存器中 MOV R1,R2 SUB R0,R1,R2 3.存储器寻址方式(MemoryAddressingMode)

直接地址寻址方式(DirectAddressAddressingMode)

---操作数在存储器中,地址指令直接给出 LDR R0,Label

寄存器加偏移间接寻址方式(RegisterPlusOffsetIndirectAddressingMode)

---操作数在存储器中,地址由寄存器间接给出 LDR R0,[R1,#4];绿色为数据型操作数;红色为地址型操作数

LDR R0,=X1

MOV R1,#5

MOV R2,#0

loop1 LDR R3,[R0],#4

ADD R2,R2,R3

SUBS R1,R1,#1

BNE loop1

LDR R0,=X2

STR R2,[R0]

deadloop B deadloop第三章CortexM3指令系统---立即数寻址方式Thumb-2指令集中运算类指令的一般格式为:操作码{cond}{s}{.W/N} 目的操作数(Rd), 第1操作数(Rn), 第2操作数(Rm)其中目的操作数和第1操作数必须为寄存器寻址方式,第2操作数可以是立即数寻址方式、寄存器寻址方式和寄存器移位方式三种。花括号{}是可选项。1.使用MOV指令把立即数送寄存器当使用MOV指令把立即数送寄存器时,立即数为以下三种情况时,可以汇编得到正确的指令代码。(1)立即数能表示成8位(小于0xFF),如图3.12第4行指令MOVR0,#0xFF,指令代码为F04F00FF。(2)立即数能表示成16位(小于0xFFFF),如图3.12第5行指令MOVR0,#0xFFFF,指令代码为F64F4008。(3)立即数能表示成一个通过8位二进制数逻辑左移0-24位得到。如图3.12第6行指令MOVR0,#0x88000000。立即数#0x88000000可以通过将8位二进制数0x88逻辑左移24位得到,指令代码为F04F4008。图3.12立即数寻址方式的三种能正确编码的情形例:MOVR0,#0XFF00;将立即数0XFF00送寄存器R0第三章CortexM3指令系统---立即数寻址方式0x55R0MOVR0,#0xFF00程序存储MOVR0,#0xFF00机器指令为:F44F407F0xFF00从代码中获得数据第三章CortexM3指令系统---使用LDR指令把立即数送寄存器2.使用LDR指令把立即数送寄存器(1)指令MOVR0,#0x88000001中的立即数#0x88000001就不属于上面所说的三种情况,进行汇编时会得到错误信息“error:A1871E:Immediate0x88000001cannotberepresentedby0-255shiftedleftby0-23orduplicatedinall,oddorevenbytes”。解决的办法就是通过LDR指令来借助文字池把立即数送给寄存器,如图3.13所示。紧挨代码段后0x00000018处的文字池中存放的立即数#0x88000001图3.13LDR伪指令通过0x00000018处的默认文字池实现立即数的传送演示观察默认文字池的位置;了解对文字池访问的实现方法;第三章CortexM3指令系统---使用LDR指令把立即数送寄存器2.使用LDR指令把立即数送寄存器(2)默认情况下,系统会自动将文字池放在当前代码段之后,但要注意,由于LDR指令的寻址范围是前后4KB,如果用户程序比较大,则可能使整个程序段超过4KB的范围,这样汇编器在程序段的末尾开辟的缺省文字池与访问它的LDR指令之间的距离就有可能超出范围,LDR指令就不能正确加载数据了,汇编程序会给出“error:A1284E:Literalpooltoodistant,useLTORGtoassembleitwithin4KB”的错误信息。为了解决这一问题,就需要使用LTORG伪指令在代码段内部自定义文字池,如图3.14所示。演示观察3-5-Immediateaddressing-literalpool_fig3.14图3.14LDR伪指令通过自定义文字池实现立即数的传送0x00000018处自定义的文字池,存放立即数#0x12345678和#0x87654321第三章CortexM3指令系统---使用LDR指令把立即数送寄存器3.使用指令LDR把变量地址送寄存器

在程序设计过程中,经常需要读取变量的地址并送寄存器作为地址指针,以方便对变量中元素的访问。

与使用LDR指令把立即数送寄存器的操作过程相同,LDR指令把变量地址送寄存器也是通过文字池实现的。演示观察3-6-load-address-register_fig3.15图3.15LDR伪指令通过自定义文字池实现地址的传送0x00000030处默认文字池,存放变量X1的地址0x00000038和变量X2的地址0x20000000第三章CortexM3指令系统---运算指令中立即数寻址方式的实现4.运算指令中立即数寻址方式的实现指令ADDR0,#0xFF100---错误!!!可以通过以下两种途径来解决:(1)把#0xFF10送R1,然后左移4位后再与R0相加。MOV R1,#0xFF10ADD R0,R1,LSL4(2)直接用LDR指令把#0xFF100送寄存器R1,然后再与R0相加。LDR R1,#0xFF100ADD R0,R1由此可见,字长固定的精简指令虽然在性能上带来了很多好处,但对于指令中立即数寻址方式的操作确实也带来了不少的不便。读者了解当立即数型操作数在指令中无法编码时,Trumb-2指令集是如何通过了默认文字池或自定义文字池实现对立即数型操作数的处理是很有必要的。

0xAA0x55R2R1MOVR1,R20xAA第三章CortexM3指令系统---寄存器(寄存器移位)寻址方式演示0417_addressing_2_R寄存器寻址方式操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。应用示例:

MOVR1,R2

;将R2的值存入R1

SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0

第三章CortexM3指令系统---寄存器(寄存器移位)寻址方式2.寄存器移位寻址方式LSL/ASL:逻辑左移/算术左移(LogicalShiftLeft/ArithmeticShiftLeft)LSR:逻辑右移(LogicalShiftRight)ASR:算术右移(ArithmeticShiftRight)ROR:循环右移(ROtateRight)RRX:带扩展的循环右移(RotateRighteXtendedby1place)

寄存器寻址方式允许对寄存器进行移位操作,这是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。

MOV R0,R2,LSL#3

;R2的值左移3位,结果放入R0,即R0=R2×8

ANDS R1,R1,R2,LSLR3

;R2的值左移R3位,然后和R1相“与”操作,结果放入R10x55R0R20x01MOVR0,R2,LSL#30x080x08逻辑左移3位第三章CortexM3指令系统---寄存器移位寻址方式第三章CortexM3指令系统---存储器寻址方式

精简指令集计算机中所有运算类指令的操作数都是在处理器内部存放的(立即数寻址或寄存器寻址)。把存储单元内容装入寄存器,或把寄存器内容送存储单元存储,安排了专门的LOAD和STORE指令来实现。这两类指令对存储单元访问的寻址方式有以下三种。1.直接地址寻址LDRR0,myScore ;;将变量myScore的值送寄存器R02.寄存器间接寻址LDRR2,[R1] ;R2←[R1]3.基址加变址寻址LDRR3,[R4,#0x10] ;基地址由寄存器R1提供,变址为立即数“#0x10”CortexM3预定义的存储器映射CortexM3的4G地址空间的用户级访问权限第三章CortexM3指令系统---CortexM3核地址映射第三章CortexM3指令系统---CortexM3存储器地址直接寻址是加载/存储指令访问存储空间时,在指令中直接给出操作数有效地址的一种寻址方式这个地址一般以标号的形式出现,但该标号必须在当前指令的±4KB范围内。第三章CortexM3指令系统---存储器直接地址寻址第三章CortexM3指令系统---直接地址寻址方式演示0417_addressing_3寄存器间接寻址时,ARM指令的操作数存储在某个存储单元中,寄存器中存放的是操作数的地址。这种寻址方式主要用于加载/存储单个存储器数据时。例:LDRR1,[R2] ;R1←[R2]第三章CortexM3指令系统---寄存器间接寻址方式基址变址寻址是指操作数的有效地址是由寄存器的内容加上指令中给出的变址来确定的;操作数所在存储单元的基地址由寄存器给出,这个寄存器就叫做基址寄存器。变址既可以以立即数形式给出,也可以由寄存器来提供。LDRR3,[R4,#0X12]LDRR3,[R4,R5]第三章CortexM3指令系统---基址加变址寻址LDRR3,[R4,#0x12];R3←[R4+0x12],指令执行后R4的值不发生变化LDRR3,[R4,R5];R3←[R4+R5]第三章CortexM3指令系统---基址加变址寻址在寄存器加偏移量寻址方式中,根据寄存器的内容是否改变、什么时候改变,又有零偏移、前索引偏移、后索引偏移和自动索引之分。零偏移----LDRR2,[R3] ;实际上就是寄存器间接寻址前索引偏移:LDRR2,[R3,#0X4] ;[(R3)+#0X4]装入R2,R3值不变后索引偏移:STRR2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论