




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础11、ARMv7概述主要内容2.9低功耗21、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础21、ARMv7概述主要内容2.9低功耗31、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础31、ARMv7概述主要内容2.9低功耗1.CM3程序的文件类型:C程序:CM3开发中大部分程序使用C语言编写,文件类型为“*.C”;汇编程序:涉及到硬件底层操作的代码有时必须使用汇编语言编写,文件类型为“*.S”。2.为什么学习CM3指令系统:操作系统移植编写启动代码方便程序调试1.CM3程序的文件类型:5概述5概述1.处理器的寻址方式;2.指令的特点;3.指令的种类,它能完成哪些功能。学习重点1.处理器的寻址方式;学习重点71、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础71、ARMv7概述主要内容2.9低功耗3.2ARM处理器寻址方式寻址方式分类
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有8种基本寻址方式。1.寄存器寻址;
2.立即寻址;3.寄存器移位寻址; 4.寄存器间接寻址;5.基址寻址; 6.多寄存器寻址;7.堆栈寻址; 8.相对寻址。3.2ARM处理器寻址方式寻址方式分类寻
操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2 ;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0
0xAA0x55R2R1寻址方式分类——寄存器寻址MOVR1,R20xAA3.2ARM处理器寻址方式操作数的值在寄存器中,指令中的地址码字段指出
立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位MOV R0,#0xFF000;将立即数0xFF000装入R0寄存器
0x55R0MOVR0,#0xFF00程序存储寻址方式分类——立即寻址MOVR0,#0xFF000xFF00从代码中获得数据3.2ARM处理器寻址方式立即寻址指令中的操作码字段后面的地址码部分即
寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOV R0,R2,LSL#3
;R2的值左移3位,结果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3
;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R10x55R0R20x01寻址方式分类——寄存器移位寻址MOVR0,R2,LSL#30x080x08逻辑左移3位3.2ARM处理器寻址方式寄存器移位寻址是ARM指令集特有的寻址方式。
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDR R1,[R2] ;将R2指向的存储单元的数据读出
;保存在R1中SWP R1,R1,[R2] ;将寄存器R1的值和R2指定的存储
;单元的内容交换0x55R0R20x400000000xAA0x40000000寻址方式分类——寄存器间接寻址LDRR0,[R2]0xAA3.2ARM处理器寻址方式寄存器间接寻址指令中的地址码给出的是一个通用
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元
;的内容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存储单元寻址方式分类——基址寻址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据3.2ARM处理器寻址方式基址寻址就是将基址寄存器的内容与指令中给出的
多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,{R2-R7,R12};将R1指向的单元中的数据读出到
;R2~R7、R12中(R1自动加1)STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保
;存到R0指向的存储;单元中
;(R0自动加1)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器寻址方式分类——多寄存器寻址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x400000103.2ARM处理器寻址方式多寄存器寻址一次可传送几个寄存器值,允许一条
堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈寻址方式分类——堆栈寻址3.2ARM处理器寻址方式堆栈是一个按特定顺序进行存取的存储区,操作顺寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈3.2ARM处理器寻址方式寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。寻址方式分类——堆栈寻址0x123456780x12345678栈顶SP0x12345678栈顶SP压栈压栈3.2ARM处理器寻址方式栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类——堆栈寻址3.2ARM处理器寻址方式所以可以组合出四种类型的堆栈方式:寻址方式分类——堆栈寻址3
相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:
BL SUBR1 ;调用到SUBR1子程序
BEQ LOOP ;条件跳转到LOOP标号处
...LOOP MOV R6,#1 ...SUBR1 ...寻址方式分类——相对寻址3.2ARM处理器寻址方式相对寻址是基址寻址的一种变通。由程序计数器P201、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础201、ARMv7概述主要内容2.9低功耗3.3指令集介绍3.3.1汇编基础3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍简单的程序;文件名:TEST1.S
;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令START MOV R0,#0 ;设置参数
MOV R1,#10LOOP BL ADD_SUB ;调用子程序ADD_SUB
B LOOP ;跳转到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件结束
使用“;”进行注释标号顶格写实际代码段声明文件结束简单的程序;文件名:TEST1.S使用“;”进行注释标号顶3.3指令集介绍
3.3.1汇编基础3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍243.3.1汇编基础1、基本语法标号
操作码操作数1,操作数2,……;注释注释:1)标号可选,如果有,必须顶格写。标号的作用是让汇编器来计算程序转移地址。2)操作码是指令的助记符,前面必须至少有一个空白符。3)第1操作数,通常给出本指令的执行结果的存储位置。4)第2操作数以后的操作数,通常是参与运算的数据或其位置。5);后的为注释,不影响汇编器的工作。243.3.1汇编基础1、基本语法标号注释:252、汇编语言中的后缀1)条件执行后缀通常用于跳转指令;2)如果其他指令在IF-THEN指令块中,也可以使用条件执行后;3)条件后缀和S后缀可同时使用。252、汇编语言中的后缀1)条件执行后缀通常用于跳转指令;263、统一汇编语言ULA
1)为了支持Thumb-2,并且最大程度的发挥其功能,ARM汇编器引入了一个“统一汇编语言”ULA,同时支持16位和32位指令。
2)在ULA语法中,指令使用后缀s才可以影响APSR。
3)在UAL下,汇编器能主动决定用16位指令或32位指令,也可以手工指定;263、统一汇编语言ULA1)为了支持Thumb-2,3.3指令集介绍3.3.1汇编基础
3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令28存储器访问指令28存储器访问指令——后缀装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址B:从/向指定位置加载/存储字节H:从/向指定位置加载/存储半字无:从/向指定位置加载/存储字EX:排他性加载/存储D:从/向指定位置加载/存储双字存储器访问指令——后缀装载指令:LDRx目标寄存器,存储器访问指令——地址形式装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址立即数:立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,#0x12]
寄存器:寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2]
寄存器及移位常数:寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2,LSL
#2]存储器访问指令——地址形式装载指令:LDRx目标寄存器存储器访问指令——寻址方式装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址零偏移:如:LDRRd,[Rn]前索引偏移:
如:LDRRd,[Rn,#0x04]!程序相对偏移:
如:LDRRd,labe1
后索引偏移:
如:LDRRd,[Rn],#0x04存储器访问指令——寻址方式装载指令:LDRx目标寄存存储器访问指令——单寄存器加载/存储存储器访问指令——单寄存器加载/存储0x55R2R50x400000000x123456780x40000000存储器地址应用示例:LDR R2,[R5]
;将R5指向地址的字数据存入R20x12345678ARM存储器访问指令——单寄存器加载应用0x55R2R50x400000000x123456780x0x12345678R1R20x400000000x??0x40000004存储器地址应用示例:STR R1,[R2,#0x04]
;将R1的数据存储到R0+0x04地址0x12345678+4ARM存储器访问指令——单寄存器保存应用0x12345678R1R20x400000000x??0x3535存储器访问指令——多寄存器存取装载指令:LDM
源地址,目标寄存器列表存储指令:STM
目标地址,源寄存器列表存储器源地址目标寄存器1目标寄存器n存储器目标地址源寄存器1源寄存器n存储器访问指令——多寄存器存取装载指令:LDM源地址存储器访问指令——多寄存器存取装载指令:LDM存储指令:STMxxLDM/STM指令搭配不同的后缀实现不同方式地址增长方式:IA:每次传送后地址加4DB:每次传送前地址减4存储器访问指令——多寄存器存取装载指令:LDM存储指令:ST存储器访问指令——多寄存器加载/存储存储器访问指令——多寄存器加载/存储ARM存储器访问指令——多寄存器存取数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHARM存储器访问指令——多寄存器存取数据块传送指令操作过程如0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器0x010x020x030x040x40000010应用示例:LDMIAR1!,{R2-R4,R6}
将R1指向的内存数据读取到R0-R4和R6寄存器中存储器访问指令——多寄存器存取0x40000000R1R20x??0x010x40000041另外两种存储器操作为栈的PUSH和POP.PUSH{R0,R4-R7,R9}POP{R2,R3}41另外两种存储器操作为栈的PUSH和POP.PUSH{R42存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令42存储器访问指令常见的算术四则运算指令常见的算术四则运算指令44存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令44存储器访问指令cortex-m34基础4指令系统--实时嵌入式-硬件基础课件46存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令46存储器访问指令47移位操作指令47移位操作指令cortex-m34基础4指令系统--实时嵌入式-硬件基础课件49存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令49存储器访问指令50带符号展开指令SXTBRd,Rm;Rd=signext(Rm[7:0])SXTHRd,Rm;Rd=signext(Rm[15:0])50带符号展开指令SXTBRd,Rm;Rd=signe51存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令51存储器访问指令52数据反转指令52数据反转指令53存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令53存储器访问指令54位域处理指令54位域处理指令5555565657存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令57存储器访问指令58跳转依据在CM3中,下列指令可以更新PSR中的标志:
16位算术逻辑指令
32位带S后缀的算术逻辑指令
比较指令(如,CMP/CMN)和测试指令(如TST/TEQ)
直接写PSR/APSR(MSR指令)58跳转依据在CM3中,下列指令可以更新PSR中的标志:操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于
1011LTN!=V有符号数小于
1100GTZ=0,N=V有符号数大于
1101LEZ=1,N!=V有符号数小于或等于
1110AL任何无条件执行
(指令默认条件)1111NV任何从不执行(不要使用)指令条件码表操作码条件助记符标志含义0000EQZ=1相等0001NEZ60BEQlabel;当Z=1时转移CMPR0,R1;比较R0,R1ITTETGT;IfR0>R1Then(T代表Then,E代表Else)MOVGTR2,R0MOVLER2,R0MOVGTR3,R1MOVGTR3,R160BEQlabel;当Z=1时转移C61存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令61存储器访问指令62隔离指令在一些结构比较复杂的存储器系统中是必要的。在这类系统中,如果没有必要的隔离,会导致系统发生紊乱危象(racecondition),(相当于数电中的“竞争与冒险”)。如果RAM的访问是带缓冲的,并且写完之后马上读,就必须让它“喘口气”——用DMB指令来隔离,以保证缓冲中的数据已经落实到RAM中。DSB比DMB更保险(当然也是有执行代价的),它是宁可错杀也不漏网——清空了写缓冲,使得任何它后面的指令,不管要不要使用先前的存储器访问结果,通通等待访问完成。如果某个程序从下一条要执行的指令处更新了自己,但是先前的旧指令已经被预取到流水线中去了,此时就必须清洗流水线,把旧版本的指令洗出去,再预取新版本的指令。因此,必须在被更新代码段的前面使用ISB,以保证旧的代码从流水线中被清洗出去,不再有机会执行。62隔离指令在一些结构比较复杂的存储器系统中是必要的63存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令63存储器访问指令64
CM3中的饱和运算指令分为两种:1)“没有直流分量”的交流信号饱和——带符号饱和运算;
2)无符号饱和运算则类似于“削顶失真+单向导通”。
64CM3中的饱和运算指令分为两种:65指令名
功能描述SSAT.WRd,#imm5,Rn,{,shift}以带符号数的边界进行饱和运算(交流)USAT.WRd,#imm5,Rn,{,shift}以无符号数的边界进行饱和运算(带纹波的直流)65指令名功能描述SSAT.WRd,#imm53.3指令集介绍3.3.1汇编基础3.3.2指令集
3.3.3CM3中的前卫指令3.3指令集介绍MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字67MSR/MRS6768MRS、MSR专用特殊寄存器访问指令,只能在特权级状态下使用,APSR除外,APSR可以在用户级状态下使用。MRS<Rn>,<SReg>;加载特殊功能寄存器的值到RnMSR<Sreg>,<Rn>;存储Rn的值到特殊功能寄存器指定PSP进行更新的例子:LDRR0,=0x20008000MSRPSP,R0BXLR;如果是从异常(Handler模式)返回到用户线程模式,则使用新的PSP的值作为栈顶指针实质上是替换了之前线程状态使用的PSP指针(所指向的内存地址空间)68MRS、MSR专用特殊寄存器访问指令,只能在特6969MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字70MSR/MRS7071IF-THEN(IT)指令围起一个快,里面最多有4条指令,可以条件执行。IT指令已经带了一个“T”,因此还可以最多再带3个“T”或者“E”,并且对T和E的顺序没有要求,其中T对应条件成立时执行的语句,E对应条件不成立时执行的语句。71IF-THEN(IT)指令围起一个快,里面最多有7272MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字73MSR/MRS737432位硬件除法指令7432位硬件除法指令MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字75MSR/MRS7576这些指令专门服务于大端模式和小端模式的转换,最常用于网络应用程序中(网络通常是大端,主机通常是小端)76这些指令专门服务于大端模式和小端模式的转换,最常77
RBIT比前面的REV之流更精细,它是按位反转的,相当于把32位整数的二进制表示法水平旋转180度。其格式为:77RBIT比前面的REV之流更精细,它是按位MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字78MSR/MRS7879指令格式79指令格式MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字80MSR/MRS8081UBFX/SBFX都是位段提取指令,语法格式为:UBFX从Rn中取出任一个位段,执行零扩展后放到Rd中。SBFX也抽取任意的位段,但是以带符号的方式进行扩展。81UBFX/SBFX都是位段提取指令,语法格式为:UBFMSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字82MSR/MRS828364位数据加载/存储指令8364位数据加载/存储指令MSR/MRSIF-THENSDIV/UDIVREV/REVH/REVSHSXTB/SXTH/UXTB/UXTHUBFX/SBFXLDRD/STRD表格跳转字节/表格跳转半字(TBB/TBH)84MSR/MRS8485TBB(查表跳转字节范围的偏移量)指令和TBH(查表跳转半字范围的偏移量)指令,分别用于从一个字节数组表中查找转移地址,和从半字数组表中查找转移地址。TBB和TBH只能做前向跳转,即偏移量只能是无符号整数。因为CM3的指令至少是按半字对齐的,表中的数值都是在左移一位后才作为前向跳转的偏移量的。又因为PC的值为当前地址+4,故TBB的跳转范围可达255*2+4=514;TBH的跳转范围更可高达65535*2+4=128KB+2。Rn指向跳转表的基质,Rm则给出表中元素的下标。85TBB(查表跳转字节范围的偏移量)指令和TBH(86868787888889THEEND.89THEEND.901、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础11、ARMv7概述主要内容2.9低功耗911、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础21、ARMv7概述主要内容2.9低功耗921、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础31、ARMv7概述主要内容2.9低功耗1.CM3程序的文件类型:C程序:CM3开发中大部分程序使用C语言编写,文件类型为“*.C”;汇编程序:涉及到硬件底层操作的代码有时必须使用汇编语言编写,文件类型为“*.S”。2.为什么学习CM3指令系统:操作系统移植编写启动代码方便程序调试1.CM3程序的文件类型:94概述5概述1.处理器的寻址方式;2.指令的特点;3.指令的种类,它能完成哪些功能。学习重点1.处理器的寻址方式;学习重点961、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础71、ARMv7概述主要内容2.9低功耗3.2ARM处理器寻址方式寻址方式分类
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有8种基本寻址方式。1.寄存器寻址;
2.立即寻址;3.寄存器移位寻址; 4.寄存器间接寻址;5.基址寻址; 6.多寄存器寻址;7.堆栈寻址; 8.相对寻址。3.2ARM处理器寻址方式寻址方式分类寻
操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2 ;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0
0xAA0x55R2R1寻址方式分类——寄存器寻址MOVR1,R20xAA3.2ARM处理器寻址方式操作数的值在寄存器中,指令中的地址码字段指出
立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位MOV R0,#0xFF000;将立即数0xFF000装入R0寄存器
0x55R0MOVR0,#0xFF00程序存储寻址方式分类——立即寻址MOVR0,#0xFF000xFF00从代码中获得数据3.2ARM处理器寻址方式立即寻址指令中的操作码字段后面的地址码部分即
寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOV R0,R2,LSL#3
;R2的值左移3位,结果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3
;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R10x55R0R20x01寻址方式分类——寄存器移位寻址MOVR0,R2,LSL#30x080x08逻辑左移3位3.2ARM处理器寻址方式寄存器移位寻址是ARM指令集特有的寻址方式。
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDR R1,[R2] ;将R2指向的存储单元的数据读出
;保存在R1中SWP R1,R1,[R2] ;将寄存器R1的值和R2指定的存储
;单元的内容交换0x55R0R20x400000000xAA0x40000000寻址方式分类——寄存器间接寻址LDRR0,[R2]0xAA3.2ARM处理器寻址方式寄存器间接寻址指令中的地址码给出的是一个通用
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元
;的内容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存储单元寻址方式分类——基址寻址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据3.2ARM处理器寻址方式基址寻址就是将基址寄存器的内容与指令中给出的
多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,{R2-R7,R12};将R1指向的单元中的数据读出到
;R2~R7、R12中(R1自动加1)STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保
;存到R0指向的存储;单元中
;(R0自动加1)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器寻址方式分类——多寄存器寻址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x400000103.2ARM处理器寻址方式多寄存器寻址一次可传送几个寄存器值,允许一条
堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈寻址方式分类——堆栈寻址3.2ARM处理器寻址方式堆栈是一个按特定顺序进行存取的存储区,操作顺寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈3.2ARM处理器寻址方式寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。寻址方式分类——堆栈寻址0x123456780x12345678栈顶SP0x12345678栈顶SP压栈压栈3.2ARM处理器寻址方式栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类——堆栈寻址3.2ARM处理器寻址方式所以可以组合出四种类型的堆栈方式:寻址方式分类——堆栈寻址3
相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:
BL SUBR1 ;调用到SUBR1子程序
BEQ LOOP ;条件跳转到LOOP标号处
...LOOP MOV R6,#1 ...SUBR1 ...寻址方式分类——相对寻址3.2ARM处理器寻址方式相对寻址是基址寻址的一种变通。由程序计数器P1091、ARMv7概述2.Cortex-M3基础
2.1结构框图
2.2操作模式、特权等级2.3存器组2.4流水线
2.5总线
2.6存储系统
2.7中断和异常
2.8SYSTICK定时器主要内容
2.9低功耗2.10复位2.11MPU2.12调试架构2.13调试部件
3.Cortex-M3指令集
3.1指令集综述
3.2寻址方式
3.3指令集介绍
4.K60硬件基础201、ARMv7概述主要内容2.9低功耗3.3指令集介绍3.3.1汇编基础3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍简单的程序;文件名:TEST1.S
;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令START MOV R0,#0 ;设置参数
MOV R1,#10LOOP BL ADD_SUB ;调用子程序ADD_SUB
B LOOP ;跳转到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件结束
使用“;”进行注释标号顶格写实际代码段声明文件结束简单的程序;文件名:TEST1.S使用“;”进行注释标号顶3.3指令集介绍
3.3.1汇编基础3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍1133.3.1汇编基础1、基本语法标号
操作码操作数1,操作数2,……;注释注释:1)标号可选,如果有,必须顶格写。标号的作用是让汇编器来计算程序转移地址。2)操作码是指令的助记符,前面必须至少有一个空白符。3)第1操作数,通常给出本指令的执行结果的存储位置。4)第2操作数以后的操作数,通常是参与运算的数据或其位置。5);后的为注释,不影响汇编器的工作。243.3.1汇编基础1、基本语法标号注释:1142、汇编语言中的后缀1)条件执行后缀通常用于跳转指令;2)如果其他指令在IF-THEN指令块中,也可以使用条件执行后;3)条件后缀和S后缀可同时使用。252、汇编语言中的后缀1)条件执行后缀通常用于跳转指令;1153、统一汇编语言ULA
1)为了支持Thumb-2,并且最大程度的发挥其功能,ARM汇编器引入了一个“统一汇编语言”ULA,同时支持16位和32位指令。
2)在ULA语法中,指令使用后缀s才可以影响APSR。
3)在UAL下,汇编器能主动决定用16位指令或32位指令,也可以手工指定;263、统一汇编语言ULA1)为了支持Thumb-2,3.3指令集介绍3.3.1汇编基础
3.3.2指令集3.3.3CM3中的前卫指令3.3指令集介绍存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令117存储器访问指令28存储器访问指令——后缀装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址B:从/向指定位置加载/存储字节H:从/向指定位置加载/存储半字无:从/向指定位置加载/存储字EX:排他性加载/存储D:从/向指定位置加载/存储双字存储器访问指令——后缀装载指令:LDRx目标寄存器,存储器访问指令——地址形式装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址立即数:立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,#0x12]
寄存器:寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2]
寄存器及移位常数:寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2,LSL
#2]存储器访问指令——地址形式装载指令:LDRx目标寄存器存储器访问指令——寻址方式装载指令:LDRx目标寄存器,源地址保存指令:STRx源寄存器,目标地址零偏移:如:LDRRd,[Rn]前索引偏移:
如:LDRRd,[Rn,#0x04]!程序相对偏移:
如:LDRRd,labe1
后索引偏移:
如:LDRRd,[Rn],#0x04存储器访问指令——寻址方式装载指令:LDRx目标寄存存储器访问指令——单寄存器加载/存储存储器访问指令——单寄存器加载/存储0x55R2R50x400000000x123456780x40000000存储器地址应用示例:LDR R2,[R5]
;将R5指向地址的字数据存入R20x12345678ARM存储器访问指令——单寄存器加载应用0x55R2R50x400000000x123456780x0x12345678R1R20x400000000x??0x40000004存储器地址应用示例:STR R1,[R2,#0x04]
;将R1的数据存储到R0+0x04地址0x12345678+4ARM存储器访问指令——单寄存器保存应用0x12345678R1R20x400000000x??0x12435存储器访问指令——多寄存器存取装载指令:LDM
源地址,目标寄存器列表存储指令:STM
目标地址,源寄存器列表存储器源地址目标寄存器1目标寄存器n存储器目标地址源寄存器1源寄存器n存储器访问指令——多寄存器存取装载指令:LDM源地址存储器访问指令——多寄存器存取装载指令:LDM存储指令:STMxxLDM/STM指令搭配不同的后缀实现不同方式地址增长方式:IA:每次传送后地址加4DB:每次传送前地址减4存储器访问指令——多寄存器存取装载指令:LDM存储指令:ST存储器访问指令——多寄存器加载/存储存储器访问指令——多寄存器加载/存储ARM存储器访问指令——多寄存器存取数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHARM存储器访问指令——多寄存器存取数据块传送指令操作过程如0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器0x010x020x030x040x40000010应用示例:LDMIAR1!,{R2-R4,R6}
将R1指向的内存数据读取到R0-R4和R6寄存器中存储器访问指令——多寄存器存取0x40000000R1R20x??0x010x400000130另外两种存储器操作为栈的PUSH和POP.PUSH{R0,R4-R7,R9}POP{R2,R3}41另外两种存储器操作为栈的PUSH和POP.PUSH{R131存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令42存储器访问指令常见的算术四则运算指令常见的算术四则运算指令133存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令44存储器访问指令cortex-m34基础4指令系统--实时嵌入式-硬件基础课件135存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令46存储器访问指令136移位操作指令47移位操作指令cortex-m34基础4指令系统--实时嵌入式-硬件基础课件138存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令49存储器访问指令139带符号展开指令SXTBRd,Rm;Rd=signext(Rm[7:0])SXTHRd,Rm;Rd=signext(Rm[15:0])50带符号展开指令SXTBRd,Rm;Rd=signe140存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令51存储器访问指令141数据反转指令52数据反转指令142存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令53存储器访问指令143位域处理指令54位域处理指令1445514556146存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令57存储器访问指令147跳转依据在CM3中,下列指令可以更新PSR中的标志:
16位算术逻辑指令
32位带S后缀的算术逻辑指令
比较指令(如,CMP/CMN)和测试指令(如TST/TEQ)
直接写PSR/APSR(MSR指令)58跳转依据在CM3中,下列指令可以更新PSR中的标志:操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于
1011LTN!=V有符号数小于
1100GTZ=0,N=V有符号数大于
1101LEZ=1,N!=V有符号数小于或等于
1110AL任何无条件执行
(指令默认条件)1111NV任何从不执行(不要使用)指令条件码表操作码条件助记符标志含义0000EQZ=1相等0001NEZ149BEQlabel;当Z=1时转移CMPR0,R1;比较R0,R1ITTETGT;IfR0>R1Then(T代表Then,E代表Else)MOVGTR2,R0MOVLER2,R0MOVGTR3,R1MOVGTR3,R160BEQlabel;当Z=1时转移C150存储器访问指令算术运算指令逻辑运算指令移位、循环指令展开指令数据反转指令位域处理和操作指令条件跳转指令屏障和存储器屏障指令饱和运算指令61存储器访问指令151隔离指令在一些结构比较复杂的存储器系统中是必要的。在这类系统中,如果没有必要的隔离,会导致系统发生紊乱危象(racecondition),(相当于数电中的“竞争与冒险”)。如果RAM的访问是带缓冲的,并且写完之后马上读,就必须让它“喘口气”——用DMB指令来隔离,以保证缓冲中的数据已经落实到RAM中。DSB比DMB更保险(当然也是有执行代价的),它是宁可错杀也不漏网——清空了写缓冲,使得任何它后面的指令,不管要不要使用先前的存储器访问结果,通通等待访问完成。如果某个程序从下一条要执行的指令处更新了自己,但是先
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 荐销售工作计划
- 自动控制原理第二版吴麒习题
- 设备清扫标准样本
- 2025年四川省遂宁市中考地理真题(原卷版)
- 从中草药萃取液制备制药油的研发实践解析
- 道德与法治(广东卷)(考试版A3)
- 2025年android线程!Android开发你需要了解的那些事吊打面试官系列!-安卓线程沙箱
- 2024-2025学年下学期高一生物人教版期末必刷常考题之协同进化与生物多样性的形成
- 建筑施工特种作业-建筑起重机械司机(施工升降机)真题库-2
- 山东中考坑人题目及答案
- 供水公司自来水厂隐患排查和风险分级管控管理制度
- 企业一季一课安全教育内容
- 《乘风破浪扬帆起航》高三主题班会 高中主题班会
- GB/T 44543-2024预制混凝土节段拼装用环氧胶粘剂
- 附着式升降脚手架维护保养管理制度
- 四川凉山历年中考语文现代文之说明文阅读7篇(含答案)(2003-2023)
- 基本公共卫生服务项目糖尿病患者管理考核反馈表
- 山东省潍坊市2024-2025学年高二地理下学期期末考试试题
- 空间直线平面的垂直课件 高三数学一轮复习
- 中国文化概论期末考试试题
- 《保安员礼仪培训》课件
评论
0/150
提交评论