第四章 ARM指令系统
ARM指令系统
ARM指令集介绍 指令集介绍
■ ARM指令集 指令集——第2个操作数 指令集 第 个操作数 #Rm,shift——寄存器移位方式 寄存器移位方式 将寄存器 寄存器的移位结果作为操作数(移位操作不消耗 寄存器 额外的时间),但寄存器 寄存器Rm值保持不变,移位方 寄存器 法如下:
操作码 ASR #n LSL #n LSR #n 算术右移n位 逻辑左移n位 逻辑右移n位 说明 操作码 ROR #n RRX Type Rs 循环右移n位 带扩展的循环右移1位 Type为移位的一种类型,Rs为偏移 量寄存器,低8位有效。 说明
0x00
0x00
0x7F
0x02
经检验0x7f00,0x02均为合法立即数 均为合法立即数 经检验
ARM指令集介绍 指令集介绍
■
放到寄存器R1中的步骤 中的步骤: 将0x7f02 放到寄存器 中的步骤:
1、MOV R3, #0x7F00 2、 ORR R1, R3, #2 、 、
立即 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0x00 0x00 0x7F 0x00 数
ARM指令长度概述 指令长度概述
– 指令集可以是以下任一种 32 bits 长 (ARM状态)
16 bits 长 (Thumb 状态)
– ARM7TDMI及以上版本 ARM7TDMI及以上版本
支持3 支持3种数据类型
字节 (8-bit) 半字 (16-bit) 字 (32-bit) – 字必须被排成4个字节边界对齐,半字必须被排列成 字必须被排成4个字节边界对齐, 2个字节边界对齐
00 R1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0xFF 0xFF 0xFF 0xFD 0xFE 0xFF 11111111111111111111111111111100 LSL #2 0xFF 0xFF 0xFF 0xFD MOV R3 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 0xXX 0xXX 0xXX 0xXX
4 ARM体系结构
21
ARM7与CORTEX比较
22
ARM编程模型
扩展协处 指令缓存 理器接口 器 指令存储 管理单元
ARM硬件架构
跟踪 接口
ARM9TDMI32 RISC处理器
AMBA 总线
写缓 冲
数据缓 存器 JTAG
数据存储 管理单元
回写存 储单元
23
ARM微处理器的工作状态
从编程角度看,ARM微处理器的工作状态一般有两种, 并可在两种状态之间切换: ARM状态,此时处理器执行32位的字对齐的ARM指令, 开始执行代码时处于ARM状态。 Thumb状态,此时处理器执行16位的、半字对齐的 Thumb指令。
ADR r0,ThumbProg+1
.THUMB
ThumbProg:
... ADR r0,ARMProg
BX
.ARM
r0
/*跳转到ARMProg,程序切换到ARM状态*/
/*指示编译器后面的为ARM指令*/
ARMProg: MOV r4, #4
27
ARM微处理器的工作模式(7种)
用户模式(User,usr):正常程序执行
15
ARM11微处理器系列
ARM11系列主要用于消费电子、无线和网络应用领 域,如STB、数码相机、3G移动电话、VoIP基础设 备、宽带调制解调器、WLAN介入设备和安全设备 等。
ARM11系列包含ARM1136J-S和ARM1136JF-S两种 类型。
16
SecurCore微处理器系列
SecurCore系列专为安全需要设计,除了具有ARM体 系结构各种主要特点外,在系统安全方面的特点: 带有灵活的保护单元,确保操作系统和应用数据的安全。
ARM指令系统
立即数要求以“#”为前缀,对于以十六进制表示的立即 数,还要求在“#”后加上“0x”或“&”;对于以二进制 表示的立即数,要求在“#”后加上“0b”; 对于以十进制 表示的立即数,要求在“#”后加上“0d”或缺省。
3.3.2 寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻 址方式是各类微处理器经常采用的一种方式,也是一种执 行效率较高的寻址方式。 例3.6 ADD R0,R1,R2 ;R0←R1+R2
对于ARM7微处理器而言,所有存储器的传输周期都可 以被归结到以下四种类型之一:
(1)不连续周期:ARM请求传输到某个地址或者从某个地址传输,但这个地 址跟前一个周期用到的地址没有联系,这种情况所需的时间称为访问一个非 顺序的内存位置的周期,简称为N 周期。
(2)连续周期:ARM请求传输到某个地址或者从某个地址传输,此地址或者 同上一个周期的地址相同或者是上一个周期的地址之后一个字。这种情况所 需的时间称为访问一个顺序的内存位置的周期,简称为S 周期。
3.2.4 ARM指令分类 ARM微处理器的指令集是加载/存储型的,即指令集中的 大部分指令仅能处理寄存器中的数据,而且处理结果都要 放回寄存器,而对系统存储器的访问则需要通过专门的加 载/存储指令来完成。 ARM微处理器的指令集可以分为数据处理指令、数据加 载与存储指令、分支指令、程序状态寄存器(PSR)处 理指令、协处理器指令和异常产生指令六大类。
例3.1 指令格式举例:
LDR R0,[R1] BEQ ENDDATA ;读取R1地址上的存储单元的数据到寄存器R0 ;条件分支执行指令,执行条件EQ,即相等则 跳转到ENDDATA处 ;寄存器R1中的内容加1存入寄存器R2,并影响 CPSR寄存器的值
第4章 ARM寻址方式与指令系统
数据处理指令3
3.ADD 加法指令 • • • • • • • 格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>; 功能:Rd=Rn+op2 op2可以是寄存器,被移位的寄存器或立即数。 例如: ADD R0,R1,#5 ;R0=R1+5 ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位
依版本不同,定义不同
第4章 ARM指令系统
1
ARM指令格式
2
ARM寻址方式
3 ARM 指令集
• • • • • • 数据处理指令(22种) 跳转指令(4种) Load/Store指令(16种) 程序状态寄存器指令(2种) 协处理器指令(5种) 软件中断指令 (2种)
寻址方式
• • • • • • • • •
数据处理指令8
8.RSC 带借位的反向减法指令 • 格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>; • 功能:同SBC指令,但倒换了两操作数的前后位 置,即Rd=op2-Rn-!carry。 • 例如: • 前提条件与SBC例子相同,操作数1-操作数2的实 现语句需改为: • SUBS R0,R2,R4; 低32位相减,S表示结果影响寄 存器CPSR的值 • RSC R1,R5,R3; 高32位相减
数据处理指令2
2.MVN 数据取反传送指令 • 格式:MVN{<cond>}{S} <Rd>,<op1>; • 功能:将op1表示的值传送到目的寄存器Rd中, 但该值在传送前被按位取反,即Rd=!op1; • op1可以是寄存器、被移位的寄存器或立即数。 • 例如: • MVN R0,#0 ;R0=-1
ARM指令系统
ARM指令系统.txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。
多么忙不重要,为什么忙才重要。
1.ARM指令的寻址方式有几种?试分别举例说明。
答:立即数寻址:MOV R0,#15寄存器寻址:ADD R0,R1,R2寄存器间接寻址:LDR R0,[R4]寄存器移位寻址:ADD R0,R1,R2,LSL #1基址变址寻址:LDR R0,[R1,#4]多寄存器寻址:LDMIA R0!,{R1-R4}相对寻址:BL proc;跳转到子程序proc处执行…proc MOV R0,#1堆栈寻址:STMFD R13!,{R0-R4};LDMFD R13!,{R0-R4};2.ARM指令系统对字节、半字、字的存取是如何实现的?LDR/STR字数据加载/存储指令LDRB/STRB字节数据加载/存储指令LDRH/STRH半字数据加载/存储指令LDRSB/LDRSH有符号数字节/半字加载指令3.如何从ARM指令集跳转到Thumb指令集?BX指令跳转到指令中所指定的目标地址,并实现状态的切换。
Rm是一个表达目标地址的寄存器。
当Rm中的最低位Rm[0]为1时,强制程序从ARM指令状态跳到Thumb指令状态;当Rm中的最低位Rm[0]为0时,强制程序从Thumb指令状态跳到ARM指令状态。
4.ARM指令集支持哪几种协处理器指令?CDP LDC STC MCR MRC5.ARM指令的条件码有多少个?默认条件码是什么?15个默认条件码是AL6.ARM指令中的第二操作数有哪几种形式?试举例说明。
寄存器形式MOV R1,R0;将寄存器R0的值传送到寄存器R1立即数形式MOV R0,#5;将立即数5传送到寄存器R0被移位的寄存器形式MOV R1,R0,LSL#37.MOV指令与LDR指令有何区别?LDR指令用于在存储器和处理器的寄存器之间传送数据MOV主要用于将一个寄存器中的数据传送到另一个寄存器,或者将一个立即数传送到寄存器,8.判断下列指令正误,并说明理由?(1)LDR R3,[R4]!(2)ADD R6,R5,#4!(3)LDMIA R6,{R3-R7}!(4)LDMFD R13!,{R2,R4}(5)ADD R1,R2,#0x104(6)ADD R1,R2,#0x101(7)MOV R0,R0(8)MVN R7,#0x2F100(9)MVN R0,R3,#2_011100(10)SBC R15,R6,LSR R5(11)AND R5,[R6],R7(12)MRS R15,CPSR(13)MSR CPSR,#0x001(14)MUL R3,R3,R6(15)MUL R4,R6,#0x80(16)STRB SP![R0,R4](17)LDRB R1,[R6,R4],R6(18)STRB R0,[R15,#0x04]!(19)LDRB PC,[R5](20)LDRSB R5,[R4,#0x101](21)STRSH R6,[R5]9.下列指令在什么条件下被执行SUBMI R3,R3,#0x08负数ADDNE R0,R0,R4不等10.下列两段代码是用来实现打开中断和关闭中断,请补齐空白处内容MRS R1,CPSRBIC R0,R1,__ #0x80MSR CPSR_c,R0MRS R1,CPSRORR R1,___MSR CPSR_c,R111.举例说明B和BL指令的区别、BX和BLX的区别?B指令示例:backword SUB Rl,R1,#1CMP R1,#0;比较R1和0BEQ forward;如果R1=0则跳转到forward处执行SUB R1,R2,#3SUB R1,R1,#1forward ADD R1,R2,#4ADD R2,R3,#2B backword;程序无条件跳转到标号backword处执行BL指令示例…BL func;跳转到子程序ADD R1,R2,#2;子程序调用完返回后执行的语句,返回地址…func;子程序…;子程序代码MOV R15,R14;复制返回地址到PC,实现子程序的返回BX指令示例CODE32;ARM程序段,32位编码arm1 ADR R0,thumb1+1;伪指令,把语句标号thumb1所在的地址赋;给R0,末位R0[0]置1,要跳转到THUMB指令集MOV LR,PC;设置返回地址BX R0;跳转ADD R1,R2,#2;返回地址处,第4条指令CODE16;THUMB程序段,16位编码thumb1 ADD R1,R3,#1;THUMB程序…BX LR;跳转到返回地址处,执行第4条指令BLX指令示例CODE32;ARM程序段,32位编码arm1 ADR R0,thumb1+1;伪指令,把语句标号thumb1所在的地址赋;给R0,末位R0[0]置1,要跳转到THUMB指令集;MOV LR,PC;该指令注销,比较BL指令BLX R0;跳转,同时设置返回地址即PC?LRADD R1,R2,#2;返回地址处,第4条指令CODE16;THUMB程序段,16位编码thumb1 ADD R1,R3,#1;THUMB程序…BX LR;跳转到返回地址处,执行第4条指令分析:使用BLX指令代替BX指令简化了Thumb例程的调用,因为BLX指令在连接寄存器LR中自动设置了返回地址。
第四讲 ARM指令系统和编程(2013)
➢ 每种异常都有一个优先级 ➢ 中断是一种特殊的异常
Sep 2013
No. 4
图示进入异常过程
2. 用户程序运行时发生
I1R. Q程中序断在,系硬统件模完式成下以运下行
动用作户:程序,假定当前处理
▪器将状CP态SR为寄T存hu器m内b状容态存、入允
① 前索引基址寻址方式,基址寄存器的值不改变。
LDR
R2,[R3,#0x0C]
; [R3 + 0x0C]→ R2,基址寄存器R3的值保持不变
② 前索引基址寻址方式,基址寄存器的值发生变化。
LDR R2,[R3,#0x0C]!; [R3 + 0x0C]→R2,基址寄存器 R3 = R3 + 0x0C
③ 后索引基址寻址,基址寄存器的值发生变化。
r13 (sp) r14 (lr)
spsr
Thumb state Low registers
Thumb state High registers
ARM 异常总结
➢ 异常改变指令正常执行的顺序 ➢ ARM有7种异常
复位 数据中止(ABOUT) 快速中断请求 普通中断请求 预取指中止(ABOUT) 软件中断(SWI) 未定义指令中止(UNDEF)
teqr0r153sep2013arm指令乘法指令?乘法指令编码指令执行的条件码opcode乘法指令操rm为被乘数寄存器rnrdlo为mla指令相加的寄存器或64位乘法指令的目标寄存器低32位rdrdhi为目标寄存器或64位乘法指令的目标寄存器高32位rs为乘数寄存器64位有符号乘加指令smlal11164位有符号乘法指令smull11064位无符号乘加指令umlal10164位无符号乘法指令umull10032位乘加指令mla00132位乘法指令mul000说明指令助记符操作码opcode操作码功能表54sep2013助记符说明操作条件码位置mulrdrmrs32位乘法指令rdrmrsrdrmmulcondsmlardrmrsrn32位乘加指令rdrmrsrnrdrmmlacondsumullrdlordhirmrs64位无符号乘法指令rdlordhirmrsumullcondsumlalrdlordhirmrs64位无符号乘加指令rdlordhirmrsrdlordhiumlalcondssmullrdlordhirmrs64位有符号乘法指令rdlordhirmrssmullcondssmlalrdlordhirmrs64位有符号乘加指令rdlordhirmrsrdlordhismlalcondsarm指令乘法指令32位乘法指令mul指令将rm和rs中的值相乘结果的低32位保存到rd中
ARM指令系统
BCS
LABEL2
ARM指令系统 ARM指令系统
跳转指令 跳转指令 – BL
• BL 指令的格式为 BL {条件} 目的地址 – BL 除 转移程序控制权外,同时也将程序顺序执行的下一个地址值 保存在链接寄存器(LR)中,可用于子程序的调用。 – 子程序距离当前 PC 的范围与指令B是一样:+ – 32MB – 当子程序执行完毕后,可将链接寄存器(LR)的值写回PC中,实现 子程序的返回。 BL SUB1 ; 无条件调用子程序SUB1,同时 将顺序执 ;行的下一地址值保存到R14中 . SUB1 ; 子程序入口点 . MOV PC, LR ; 子程序返回 7
ARM指令系统 ARM指令系统
ARM指令系统 ARM指令系统
1、ARM指令分类 ARM指令分类
分类指令 数据处理 数据传送 指令列举
ADD、ADC、SUB、RSB、SBC; MOV、MVN; AND、ORR、EOR、BIC;CMP、CMN;TST、TEQ; MUL、MLA、UMULL、UMLAL、SMULL、SMLAL
ARM指令系统 ARM指令系统
跳转指令 跳转指令 – BX
• BX 指令的格式为 BX {条件} 目的地址 – BX 将寄存器<Rm> 的数值复制至 PC 中,以达到转移程序控制权; – 根据寄存器 <Rm> 的最低位 <Rm>[0] 来变更指令集状态,<Rm>[0]为 1,则变更为THUMB 指令集状态。<Rm>[0] 为0,则变更为 ARM 指 令集状态。 – 此指令可将程序控制权转移到 4GB范围内的任意一地址上。 CODE 32 ; 从此处起程序以 ARM 指令集编译 . BX R0 ; ˆ R0[31:1] 为地址 LABEL1,R0[0]为1,跳转到 LABEL1处执行,并切换指令集状态为THUMB指令集 . CODE 16 ; 指示从此处起为THUMB 指令集状态 LABEL1 ;LABEL1程序入口点 . 8
周立功ARM培训精华(全套
周立功单片机
第1章 目录
1. 嵌入式系统 2. 嵌入式处理器 3. 嵌入式操作系统
周立功单片机
1.3 嵌入式操作系统
• 概述
计算机系统由硬件和软件组成,在发展初期没有 操作系统这个概念,用户使用监控程序来使用计算机。 随着计算机技术的发展,计算机系统的硬件、软件资 源也愈来愈丰富,监控程序已不能适应计算机应用的 要求。于是在六十年代中期监控程序又进一步发展形 成了操作系统(Operating System)。发展到现在,广泛 使用的有三种操作系统即多道批处理操作系统、分时 操作系统以及实时操作系统。
目录
• • • • • • • • 第一章 嵌入式系统概述 第二章 嵌入式系统工程设计 第三章 ARM7体系结构 第四章 ARM7TDMI(-S)指令系统 第五章 LPC2000系列ARM硬件结构 第六章 接口技术与硬件设计 第七章 移植μC/OS-II到ARM7 第八章 嵌入式系统开发平台
周立功单片机
●从系统的角度定义:嵌入式系统是设计完成复杂 功能的硬件和软件,并使其紧密耦合在一起的计算 机系统。术语嵌入式反映了这些系统通常是更大系 统中的一个完整的部分,称为嵌入的系统。嵌入的 系统中可以共存多个嵌入式系统。
周立功单片机
• 嵌入式系统示例 ——汽车控制系统
周立功单片机
• 嵌入式系统示例 ——汽车控制系统
周立功单片机
• 嵌入式处理器
——嵌入式DSP处理器
DSP处理器对系统结构和指令进行了特殊设计,使其适合于执 行DSP算法,编译效率较高,指令执行速度也较高。在数字滤波、 FFT、谱分析等方面DSP算法正在大量进入嵌入式领域,DSP应用正 从在通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式 DSP处理器。 嵌入式DSP处理器比较有代表性的产品是Texas Instruments的 TMS320系列和Motorola的DSP56000 系列。TMS320系列处理器包括 用于控制的 C2000系列,移动通信的C5000系列,以及性能更高的 C6000和C8000系列。DSP56000目前已经发展成为DSP56000, DSP56100,DSP56200和DSP56300等几个不同系列的处理器。另外 PHILIPS公司近年也推出了基于可重臵嵌入式DSP结构低成本、低功 耗技术上制造的R. E. A. L DSP处理器,特点是具备双Harvard结构和 双乘/累加单元,应用目标是大批量消费类产品。
第4章 ARM指令系统
LDR STR
R0,[R1] R0,[R1]
/*R0←[R1]*/ /*[R1]←R0*/
第一条指令将以R1的值为地址的存储器中的数据传 送到R0中。第二条指令将R0的值传送到以R1的值为地 址的存储器中。
0x40000000
0xAA
R2 0x40000000 R0 LDR 0xAA 0x55 R0,[R2]
7.堆栈寻址
堆栈是一种数据结构,按先进后出(First In
Last Out,FILO)的方式工作,使用一个称作 堆栈指针的专用寄存器指示当前的操作位置, 堆栈指针总是指向栈顶。 访问存储器时,存储器的地址向高地址方向生 长,称为递增堆栈(ascending stack)。 存 储器的地址向低地址方向生长,称为递减堆栈 (descending stack)。
作数,这种寻址方式是各类微处理器经常采 用的一种方式,也是一种执行效率较高的寻 址方式。以下指令:
ADD
R0,R1,R2 /*R0←R1+R2*/ 该指令的执行效果是将寄存器R1和R2的内容 相加,其结果存放在寄存器R0中。
1.寄存器寻址
MOV R1, R2
R2 R1 MOV
0xAA 0xAA 0x55 R1,R2
压栈 0x12345678 SP栈顶 SP栈顶 压栈
SP栈顶 SP栈顶
0x12345678
0x12345678
满堆栈
空堆栈
栈底
栈底
7.堆栈寻址
四种类型的堆栈工作方式
满递增堆栈:堆栈指针指向最后压入的数据,
且由低地址向高地址生成。LDMFA, STMFA 满递减堆栈:堆栈指针指向最后压入的数据, 且由高地址向低地址生成。 LDMFD, STMFD 空递增堆栈:堆栈指针指向下一个将要放入数 据的空位置,且由低地址向高地址生成。 LDMEA, STMEA 空递减堆栈:堆栈指针指向下一个将要放入数 据的空位置,且由高地址向低地址生成。 LDMED, STMED
chapter_4
4.1 ARM处理器寻址方式
• 寻址方式分类——寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式。 当第2个操作数是寄存器移位方式时,第2个寄存器 操作数在与第1个操作数结合之前,选择进行移位操 逻辑左移3位 作。寄存器移位寻址指令举例如下: MOV R0,R2,LSL #3 R2 0x01 ;R2的值左移3位,结果放入R0, 0x08
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
周立功单片机
4.1 ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
堆栈压栈 SP栈顶 0x12345678 栈底
栈区
向上 增长
堆栈存 储区
向下 增长
栈区
栈底 0x12345678 堆栈压栈
栈顶SP
周立功单片机
LDR R1,[R2] ;将R2指向的存储单元的数据读出
SWP
R1,R1,[R2]
R2 0x40000000 ;保存在R1中 R0 0xAA 0x55
;单元的内容交换
;将寄存器R1的值和R2指定的存储
LDR
R1,[R2]
周立功单片机
4.1 ARM处理器寻址方式
• 寻址方式分类——基址寻址
基址寻址就是将基址寄存器的内容与指令中给 出的偏移量相加,形成操作数的有效地址。基址寻 址用于访问基址附近的存储单元,常用于查表、数 0x4000000C 0xAA 组操作、功能部件寄存器访问等。基址寻址指令举 例如下: 将R3+0x0C作 R3 0x40000000 LDR 为地址装载数 R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元 R2 0xAA 0x55 据 ;的内容,放入R2
王道计算机组成原理第四章指令系统思维导图脑图
根据操作码的长度不同分类
定长操作码:指令系统中所有指令的操作码长度都相同 可变长操作码:指令系统中各指令的操作码长度可变
n位→2n 条指令 控制器的译码电路设计简单,但灵活性较低 控制器的译码电路设计复杂,但灵活性较高
LOAD 作用:把存储器中的数据放到寄存器中
1. 数据传送
STORE 作用:把寄存器中的数据放到存储器中
x86处理器中程序计数器PC通常被称为IP
选择语句的机器级表示
设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等
设计思路:一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基 本功能
代表:ARM架构,主要用于手机、平板等
CISC: Complex Instruction Set Computer RISC: Reduced Instruction Set Computer
概念
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍
根据指令长度分类
指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双 字长指令需要两次访存
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等
隐含寻址
优点:有利于缩短指令字长 缺点:需增加存储操作数或隐含地址的硬件 形式地址A就是操作数本身,又称为立即数,一般采用补码形式
#表示立即寻址特征
一条指令的执行:取指令,访存1次;执行指令,访存0次;
暂不考虑存结果,共访存1次
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:A的位数限制了立即数的范围,如A的位数为n,且立即数采用补码时,可 表示的数据范围为-2n−1 ~2n−1 -1
ARM处理器指令系统
ARM指令的寻址方式(8)
❖ 块拷贝寻址
块拷贝寻址类似于堆栈寻址,但堆栈寻址要配合堆栈 进行,而块拷贝则应用于普通数据传送指令。 ARM的块拷贝寻址支持4种方式: ▪ IB(Increment Before):增加之前 ▪ IA(Increment After):增加之后 ▪ DB(Decrement Before):减少之前 ▪ DA(Decrement After):减少之后
▪ 满堆栈(Full):栈指针指向上一个压入堆栈的有效数 据项。
ARM指令的寻址方式(7)
ARM共支持4种类型的堆栈: ▪ FA(Full Ascending):满递增堆栈; ▪ FD(Full Descending):满递减堆栈; ▪ EA(Empty Ascending):空递增堆栈; ▪ ED(Empty Descending):空递减堆栈; 例如:
主要包括: ➢数据传送指令 ➢算术逻辑运算指令 ➢比较测试指令等。
▪数据传送指令用于在寄存器间进行数据传送; ▪算术逻辑运算指令完成常用的算术与逻辑运算,同时可 以选择更新CPSR中的相应条件标志位; ▪比较测试指令不保存运算结果,仅根据运算结果更新 CPSR中相应的条件标志位。
数据运算指令(2)
当前程序状态寄存器CPSR
▪Q:v5以上版本才有,描述增强DSP运算指令是否 发生溢出; ▪I、F:中断禁止位,1表示中断禁止; ▪T:指示处理器处于ARM或Thumb工作状态; ▪M:表示处理器的运行模式。
指令的条件码
❖ 指令的条件码 ▪ARM处理器指令的条件域为4位,ARM状态指令的条 件域一般为指令编码的高4位。 ▪条件码共有16种,每种条件码用2个字符表示, ▪2个字符的条件码可以添加在指令助记符的后面, 和指令同时使用。例如,BEQ,表示“相等则跳转”。
arm体系架构与原理教学-04arm指令系统及汇编程序设计
TST
R1,#1
TST
R1,#0xffe
19
ARM 指令系统
TEQ指令
TEQ指令的格式为: TEQ{条件} 操作数1,操作数2
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容 或立即数进行按位的异或运算,并根据运算结果更新CPSR 中条件标志位的值。该指令通常用于比较操作数1和操作 数2是否相等。
B指令是最简单的跳转指令。一旦遇到一个 B 指令, ARM 处理器将立即跳转到给定的目标地址,从那里继续 执行。注意存储在跳转指令中的实际值是相对当前PC值 的一个偏移量,而不是一个绝对地址,它的值由汇编器来 计算。它是24位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB的地址空间)。如:
嵌入式系统教案
2019/7/20
提纲
第四章 ARM指令系统及汇编程序设计
1 ARM 指令系统 2 THUMB 指令系统 3 ATPCS 介绍
4 ARM和THUMB混合调用
2
ARM 指令系统
跳转指令
跳转指令用于实现程序流程的跳转,在ARM程序中有两种 方法可以实现程序流程的跳转:
使用专门的跳转指令。
BIC
R0,R0,#0x0b
30
ARM 指令系统
乘法指令与乘加指令
ARM微处理器支持的乘法指令与乘加指令共有6条,可分为 运算结果为32位和运算结果为64位两类,与前面的数据处
理指令不同,指令中的所有操作数、目的寄存器必须为通 用寄存器,不能对操作数使用立即数或被移位的寄存器, 同时,目的寄存器和操作数1必须是不同的寄存器。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指 令不但将运算结果保存在目的寄存器中,同时更新CPSR中 的相应条件标志位。
第4章 ARM指令系统
LDMIA R0!,{R1,R2}
3.用ARM跳转指令实现两段程序间的来回切换。 4.用ARM汇编语言编写1+2+3+…+100的程序。 5.简述Thumb指令系统的特点。
6.如何用指令实现ARM微处理器Thumb状态的进入和退出?
7.比较ARM指令系统与Thumb指令系统的异同。 8.分别说明ARM指令系统和Thumb指令系统是如何实现移位操作的。
1
2
通过对本章内容的学习,学生应该能够做到:
★掌握ARM指令系统的功能; ★理解ARM指令在嵌入式中的地位和作用; ★应用ARM指令进行简单编程。
3
4.1 ARM指令概述
4.1.1 ARM指令的分类
ARM微处理器的指令集可以分为 : 1、数据处理指令 2、程序状态寄存器(PSR)处理指令 3、加载/存储指令 4、跳转指令 5、协处理器指令 6、异常产生指令
在16种条件标志码中,只有15种可以使用,如表4.1所示,第 16种(1111)为系统保留,暂时不能使用。
5
表4.1 ARM指令的条件码
6
4.2 ARM处理器的寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作 数地址的方式。ARM处理器指令有以下9种基本寻址方式:
1、寄存器寻址;
2、立即寻址; 3、寄存器移位寻址;
11
在一般的情况下,Thumb指令与ARM指令的时间效率和空间 效率关系为: Thumb代码所需的存储空间约为ARM代码的60%~70%。 Thumb代码使用的指令数比ARM代码多约30%~40%。
若使用32位的存储器,ARM代码比Thumb代码快约40%。
若使用16位的存储器,Thumb代码比ARM快约40%~50%。 Thumb代码比ARM代码存储器的功耗会降低约30%。
第4讲(ARM指令系统)
10/14/2010
《ARM嵌入式应用技术基础》第3章
11
1.5 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形 成操作数的有效地址。 前索引基址寻址方式,基址寄存器的值不改变。 ① 前索引基址寻址方式,基址寄存器的值不改变。
LDR R2,[R3,#0x0C] R2 [R3 #0x0C] ; [R3 + 0x0C]→ R2 R2,基址寄存器R3的值保持不变 R3
10/14/2010
《ARM嵌入式应用技术基础》第3章
13
三、ARM指令后缀
基本格式如下:
<opcode> {cond} {*} <Rd> ,<Rn>{,operand2}
其中:
cond * 执行条件后缀。 其他后缀:S后缀、!后缀、字长后缀、索引后缀、T后缀等等
10/14/2010
《ARM嵌入式应用技术基础》第3章
10/14/2010
《ARM嵌入式应用技术基础》第3章
7
2.2 寄存器寻址
寄存器寻址是指:操作数的值在寄存器中,指令中的地址码字段 指出的是寄存器的编号,指令执行时直接取出寄存器值来操作。 例:寄存器寻址举例
MOV R1, R2 ;将R2的值存入R1中
10/14/2010
《ARM嵌入式应用技术基础》第3章
8
2.3 寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式,只能对第2个操作数使用。
MOV ANDS R0,R1,LSL #3 R1,R1,R2,LSL R3 ;R1的值左移3位,结果放入R0,即R0=R1×8 ;R2的值左移R3位,然后和R1相“与”操作, ;结果放入R1中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、ARM处理器寻址方式寻址名称指令格式举例指令说明备注立即寻址SUBS R0,R0,#1 R0减1,结果放入R0,并且影响标志位立即数要以“#”号为前缀,“0x”表示16进制数值MOV R0,#0xFF000 将立即数0xFF000装入R0寄存器中寄存器寻址MOV R1,R2 将R2的值存入R1 操作数的值在寄存器中SUB R0,R1,R2 将R1的值减去R2的值,果保存到R0中寄存器移位寻址MOV R0,R2,LSL#3 R2的值左移3位,结果放入R0,即时R0=R2*8 ANDS R1,R1,R2,LSL R3 R2的值左移R3位,然后和R1相与,结果放入R1 可采取的移位操作LSL 逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0LSR 逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0ASR 算数右移(Arithmetic Shift Right),移位过程中保持符号位不变,即若源操作数为正数,则字的高端空出的位补0,否则补1。
ROR 循环右移(Rotate Right),由字的低端移出的位填入字的高端空出位.RRX 带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移一位,高端空出的位用原C标志值填充。
寄存器间接寻址LDR R1,[R2] 将R2指向的存储单元的数据读出,保存在R1中即寄存器为操作数的地址指针。
SWP R1,R1,[R2] 将寄存器R1的值和R2指定的存储单元的内容交换多寄存器寻址LDMIA R1!,{R2--R7,R12} 将R1指向的单元中的数据读出到寄存器R2~R7、R12中(R1自动加1)使用多寄存器寻址指令时,寄存器子集的顺序是由小到大的顺序排列,连续的寄存器可用“--”连接,否则用“,”分隔书写。
STMIA R0!,{R2--R7,R12} 将寄存器R2~R7、R12的值保存到R0指向的存储单元中(R0自动加1)块拷贝寻址STMIA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之后增加,增长方向为向上增长块拷贝寻址指令用于将一块数据从存储器的某一位置拷贝到令一位置STMIB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之前增加,增长方向为向上增长STMDA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之后增加,增长方向为向下增长STMDB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之前增加,增长方向为向下增长堆栈寻址 STMFD SP!,{R1-R7,LR}将R1~R7、LR 入栈。
满递减堆栈。
堆栈是一种按特定顺序进行存取的存储区,操作顺序分为“后进先出”或“先进后出”。
存储器堆栈分为两种:1、向上生长:向高地址方向生长,称为递增堆栈;2、向下生长:向低地址方向生长,称为递减堆栈。
LDMFD SP!,{R1-R7,LR} 数据出栈,放入R1~R7、LR 寄存器。
满递减堆栈堆栈类型 FA(满递增) 堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。
指令如LDMFA 、STMFA 等。
EA(空递增)堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。
指令如LDMEA 、STMEA 等。
FD(满递减) 堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。
指令如LDMFD 、STMFD 等。
ED(空递减) 堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。
指令如LDMED 、STMED 等基址寻址 LDR R2,[R3,#0x0C]读取R3+0x0C 地址上的存储单元的内容,存入R2基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。
STR R1,[R0,#-4] 先R0=R0-4,然后把R1的值保存到R0指定的存储单元LDR R1,[R0,R3,LSL#1]将R0+R3*2地址上的存储单元的内容读出,存入R1相对寻址 BL SUBR1 ;调用到SUBR1子程序BEQ LOOP ;条件跳转到LOOP 标号处……LOOP: MOV R6,#1 …… SUBR1: …… 相对寻址是基址寻址的一种变通。
操作数的有效地址=基准地址+偏移量二、ARM 指令集1、指令格式ARM 指令的基本格式:<opcode> {<cond>} {S} <Rd>,<Rn> {,<operand 2>} 其中,<>号内的项是必需的,{}号内的项是可选的。
基本格式中各部分的意义如下表:第2个操作数的三种使用形式如下表:#immed_8r —常数表达式该常数必须对应8位位图,即常数是一个8位的常数循环移位偶数位得到。
例:合法常量:0x3FC(0xFF<<2)、0、0xF0000000(0xF0<<24) 非法常量;0x1FE 、511、0xFFFF 等。
指令;AND R1,R2,#0x0F Rm —寄存器方式在寄存器方式下,操作数即为寄存器的数值。
应用指令举例: SUB R1,R1,R2 MOV PC,R0 Rm,shift —寄存器移位方式 将寄存器的移位结果作为操作数,但Rm 的值保持不变。
移位方法如下: LSL #n 逻辑左移n 位(1≤n ≤31)LSR #n 逻辑右移n 位(1≤n ≤32) ASR #n 算术右移n 位(1≤n ≤32) ROR #n 循环右移n 位(1≤n ≤31) RRX 带扩展的循环右移1位type RsType 为LSL 、LSR 、ASR 和ROR 中的一种;Rs 偏移量寄存器,低8位有效。
若其值≥32,则第2个操作数的结果为0(ARS 、ROR 例外)。
例如:ADD R1,R1,R1,LSL#3 ;R1=R1*9R15为处理器的程序计数器PC ,一般不要对其进行操作,而且有些指令不允许使用R15的,如UMULL 指令。
2、条件码:使用指令条件码可实现高效的逻辑操作,提高代码效率。
指令条件码表如下: 操作码 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不想等 0010 CS/HS C=1 无符号数大于或等于 0011 CC/LO C=0 无符号数小于 0100 MI N=1 负数 0101 PL N=0 正数或零 0110 VS V=1 溢出 0111 VC V=0 没有溢出 1000 HI C=1,Z=0 无符号数大于opcode 指令助记符,如LDR 、STR 等 cond 执行条件,如EQ 、NE 等 S 是否影响CPSR 寄存器的值,书写时影响CPSR Rd 目标寄存器 Rn 第1个操作数的寄存器operand 2 第2个操作数1001 LS C=0,Z=1 无符号数小于或等于1010 GE N=V 有符号数大于或等于1011 LT N!=V 有符号数小于1100 GT Z=0,N=V 有符号数大于1101 LE Z=1,N!=V 有符号数小于或等于1110 AL 任何无条件执行(指令默认条件)1111 NV 任何从不执行(不要使用)对于Thumb指令集,只有B指令具有条件码执行功能,此指令的条件码同上表。
如果为无条件执行时,条件码助记符AL不能在指令中书写。
条件码应用举例CMP R0,R1 R0和R1比较ADDHI R0,R0,#1 若R0>R1,则R0=R0+13、ARM存储器访问指令ARM存储器访问指令表如下:助记符说明操作条件码位置LDR Rd,addressing 加载字数据Rd←[addressing], addressing索引LDR{cond} LDRB Rd,addressing 加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}B LDRT Rd,addressing 以用户模式加载字数据Rd←[addressing], addressing索引LDR{cond}T LDRBT Rd,addressing 以用户模式加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}BT LDRH Rd,addressing 加载无符号半字数据Rd←[addressing], addressing索引LDR{cond}H LDRSB Rd,addressing 加载有符号字节数据Rd←[addressing], addressing索引LDR{cond}SB LDRSH Rd,addressing 加载有符号半字数据Rd←[addressing], addressing索引LDR{cond}SH STR Rd,addressing 存储字数据[addressing]←Rd, addressing索引STR{cond} STRB Rd,addressing 存储字节数据[addressing]←Rd, addressing索引STR{cond}B STRT Rd,addressing 以用户模式存储字数据[addressing]←Rd, addressing索引STR{cond}T STRBT Rd,addressing 以用户模式存储字节数据[addressing]←Rd, addressing索引STR{cond}BT STRH Rd,addressing 存储半字数据[addressing]←Rd, addressing索引STR{cond}H LDM{mode} Rn{!},reglist 多寄存器加载reglist←[Rn....],Rn回写等LDM{cond}{mode} STM{mode} Rn{!},reglist 多寄存器存储[Rn....]←reglist,Rn回写等STM{cond}{mode} SWP Rd,Rm,Rn 寄存器和存储器字数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond} SWPB Rd,Rm,Rn 寄存器和存储器字节数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B LDM、STM的主要用途是现场保护、数据复制、参数传送等。
其模式有如下8种。
1 IA 每次传送后地址加4 用于数据块传输多寄存器传送指令映射2 IB 每次传送前地址加4 向上生长向下生长3 DA 每次传送后地址减4 满空满空4 DB 每次传送前地址减4 增加之前STMIB、STMFA LDMIB、LDMED5 FD 满递减堆栈用于堆栈操作之后STMIA、STMEA LDMIA、LDMFD6 ED 空递减堆栈减少之前LDMDB、LDMEA STMDB、STMFD7 FA 满递增堆栈之后LDMDA、LDMFA STMDA、STMED8 EA 空递增堆栈4、ARM数据处理指令数据处理指令大致可分为3类:数据传送指令、算术逻辑运算指令和比较指令。