第四章 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 SPLDRB 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结构和 双乘/累加单元,应用目标是大批量消费类产品。
- 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类:数据传送指令、算术逻辑运算指令和比较指令。