资源预览内容
第1页 / 共96页
第2页 / 共96页
第3页 / 共96页
第4页 / 共96页
第5页 / 共96页
第6页 / 共96页
第7页 / 共96页
第8页 / 共96页
第9页 / 共96页
第10页 / 共96页
亲,该文档总共96页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式系统设计与开发 第3章 ARM指令集,本章提要,3.1 ARM指令集概述 3.2 ARM寻址方式 3.3 ARM指令分类介绍 3.4 Thumb指令集,3.1 ARM指令集概述,ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM体系具有ARM和Thumb两种指令集。 ARM指令集主要包括数据处理指令、分支指令、存储器访问指令、程序状态寄存器处理指令、协处理器指令和异常中断产生指令等。,ARM指令的编码格式,cond:指令执行的条件编码。 opcode:指令操作符编码。 S:决定指令的执行是否影响CPRS的值。 Rn:包含第一个源操作数的寄存器编码。 Rd:目标寄存器编码。 Shifter_operand:第二个源操作数。,ARM指令的语法格式如下:, S ,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符; cond:执行条件; S:是否影响CPSR寄存器的值; Rd:目标寄存器; Rn:第一个源操作数的寄存器; shifter_operand :第二个源操作数;,ARM指令的条件码域,当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。 在16种条件标志码中,只有15种可以使用,如表3.所示,第16种(1111)为系统保留,暂时不能使用。,指令流水线,指令的执行分3个阶段: 取指(fetch):从存储器中读入指令。 译码(decode):对指令及其用到的寄存器做解码。 执行(execute):从寄存器送出信息,执行移位运算和逻辑运算,并将最后结果写回寄存器。,1,2,3,指令,3.2 ARM寻址方式,寻址方式分类,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。 1.立即寻址; 2.寄存器寻址; 3.寄存器间接寻址; 4.寄存器移位寻址; 5.基址变址寻址; 6.多寄存器寻址; 7.堆栈寻址; 8.块拷贝寻址; 9.相对寻址。,1.立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式, 操作数本身就在指令中给出,只要取出指令也就取到了操作 数。这个操作数被称为立即数,对应的寻址方式也就叫做立 即寻址。 ADD R0,R0,3; R0R03 MOV R1,0x18; R10x18,从代码中获得数据,例:MOV R1,#0x18,0x18,2.寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种 寻址方式是各类微处理器经常采用的一种方式,也是一种执 行效率较高的寻址方式。 ADD R0,R1,R2; R0R1R2 MOV RI,R2; R1R2,0xAA,例:MOV R1,R2,3.寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地 址,而操作数本身存放在存储器中。 LDR R0,R1 ; R0R1 STR R0,R1 ; R1R0,例:LDR R0,R1,0xAA,4.寄存器移位寻址,寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。 MOV R0,R2,LSL 3 ; R0 8*R2 ADD R3,R2,R1,LSL 2; R3 R24*R1 ADD R3,R2,R1,LSL R4; R3 R2R1*2R4,逻辑左移3位,0x08,例:MOV R0,R2,LSL #3,0x08,ARM的移位操作,CF,操作数,0,LSL,CF,操作数,0,LSR,ARM的移位操作,CF,操作数,0,ASL,CF,操作数,ASR,ARM的移位操作,CF,操作数,ROR,CF,操作数,RRX,5.基址变址寻址 基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内 容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。 变址寻址方式常用于访问某基地址附近的地址单元。 LDR R0,R1,-8 ; R0R1-8,前变址模式 LDR R0,R1,R2 ; R0R1R2 ,基地加索引寻址 LDR R0,R1 ,8; R0R1,R1R18,后变址模式 LDR R0,R1,4!; R0R14, R1R14,自动变址模式,将R1+0x0C作为地址装载数据,例:LDR R0,R1,#0x0C,0xAA,6.多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器 值的传送。这种寻址方式可以用一条指令完成传送最多16个 通用寄存器的值。 LDMIA R0,R1,R2,R3 ; R1R0 ,R2R04 ,R3R08,例:LDMIA R0,R1,R2,R3,0x40000010,7.堆栈寻址,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈,STMFD R13!,R0,R4-R12,LR; 将寄存器列表中的寄存器(R0,R4到R12,LR)内容存入堆栈 LDMFD R13!,R0,R4-R12,PC; 将堆栈内容恢复到寄存器(R0,R4到R12,PC)中。,0x12345678,0x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,0x12345678,所以可以组合出四种类型的堆栈方式: 满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。,8.块拷贝寻址,多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。 如: STMIA R0!,R1-R7 ;将R1R7的数据保存到存储器中。 ;存储指针在保存第一个值之后增加, ;增长方向为向上增长。 STMIB R0!,R1-R7 ;将R1R7的数据保存到存储器中。 ;存储指针在保存第一个值之前增加, ;增长方向为向上增长。,9.相对寻址,相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下: BL NEXT ;跳转到子程序NEXT处执行 . NEXT: . MOV PC,LR ;从子程序返回,3.3 ARM指令分类介绍,ARM指令根据其功能可分为六类: 数据处理指令(含乘法指令) 分支指令 存储器访问指令 程序状态寄存器处理指令 协处理器指令 异常中断产生指令,数据处理指令,1.数据传送指令 (1)MOV数据传送指令 指令格式: MOV条件S 目的寄存器,源操作数 MOV指令可完成从另一个寄存器、被移位的寄存器或将 一个立即数加载到目的寄存器。其中S选项决定指令的操作 是否影响CPSR中条件标志位的值,当没有S时指令不更新 CPSR中条件标志位的值。 指令示例: MOV R0,R1; R0R1 不影响标志位 MOVS R2,0x10; R20x10,并影响标志位 MOVEQ R1,0; 相等时(Z1)则R10,(2)MVN数据非法传送指令 指令格式: MVN条件S 目的寄存器,源操作数 MVN指令可完成从另一个寄存器、被移位的寄存器、或 将一个立即数加载到目的寄存器。与MOV指令不同之处是在 传送之前按位被取反了,即把一个被取反的值传送到目的寄 存器中。其中S决定指令的操作是否影响CPSR中条件标志 位的值,当没有S时指令不更新CPSR中条件标志位的值。 指令示例: MVN R3,R1,LSL 2; R1左移并取反后,结果存到R3 MVNS R2,0xFF; R20xffff00,并影响标志位,2.算术和逻辑运算指令 (1)ADD加法运算指令 指令格式: ADD条件S 目的寄存器,操作数1,操作数2 ADD指令用于把两个操作数相加,并将结果存放到目的 寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄 存器,被移位的寄存器,或一个立即数。 指令示例: ADDS R1,R1,R2; R1 = R1 + R2,并根据运算的结果更新标志位 ADD R0,R2,#1; R0 = R1 + 1 ADD R0,R2,R3, LSL#2; R0 = R2 + (R3 2),(2)ADC带进位加法运算指令 指令格式: ADC条件S 目的寄存器,操作数1,操作数2 ADC指令用于把两个操作数相加,再加上CPSR中的C 条件标志位的值,并将结果存放到目的寄存器中。它使用一 个进位标志位,这样就可以做比32位大的数的加法,注意不 要忘记设置S后缀来更改进位标志。操作数1应是一个寄存 器,操作数2可以是一个寄存器,被移位的寄存器,或一个 立即数 。 指令示例: 以下指令序列完成两个64位数的加法,第一个数由高到低存放在寄存器 R5R4,第二个数由高到低存放在寄存器 R3R2,运算结果由高到低 存放在寄存器R1R0中。 ADDS R0,R4,R2; 加低端的字 ADC R1,R5,R3; (R1,R0)(R5,R4)(R3,R2),(3)SUB减法运算指令 指令格式: SUB条件S 目的寄存器,操作数1,操作数2 SUB指令用于把操作数1减去操作数2,并将结果存放到 目的寄存器中。操作数1应是一个寄存器,操作数2可以是一 个寄存器,被移位的寄存器,或一个立即数。该指令可用于 有符号数或无符号数的减法运算。 指令示例: SUBS R1,R1,R2 ; R1= R1 - R2,并根据运算的结果 更新标志 SUBGT R0,R1,#256 ; 大于则R3R3 - 1 SUB R0,R2,R3,LSL#2 ; R0 = R2 - (R3 2),(4)SBC带进位减法运算指令 指令格式: SBC条件S 目的寄存器,操作数1,操作数2 SBC指令用于把操作数1减去操作数2,再减去CPSR中 的C条件标志位的反码,并将结果存放到目的寄存器中。操 作数1应是一个寄存器,操作数2可以是一个寄存器,被移位 的寄存器,或一个立即数。该指令使用进位标志来表示借 位,这样就可以做大于32位的减法,注意不要忘记设置S后 缀来更改进位标志。该指令可用于有符号数或无符号数的减 法运算。 指令示例: SUBS R0,R0,R2 ; SBC R1,R1,R3; 用SBC实现64位减法, (R1,R0)=(R1,R0)(R3,R2),(5)RSB
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号