收藏 分享(赏)

ch3 ARM指令系统.ppt

上传人:yjrm16270 文档编号:7207292 上传时间:2019-05-10 格式:PPT 页数:199 大小:1,016.50KB
下载 相关 举报
ch3 ARM指令系统.ppt_第1页
第1页 / 共199页
ch3 ARM指令系统.ppt_第2页
第2页 / 共199页
ch3 ARM指令系统.ppt_第3页
第3页 / 共199页
ch3 ARM指令系统.ppt_第4页
第4页 / 共199页
ch3 ARM指令系统.ppt_第5页
第5页 / 共199页
点击查看更多>>
资源描述

1、1,嵌入式系统原理与应用技术 袁志勇 王景存 章登义 刘树波北京: 北京航空航天大学出版社, 2009.11PPT教学课件,2,Ch3 ARM指令系统,3.1 ARM指令集 3.2 ARM汇编伪指令与伪操作 3.3 Thumb指令集简介 3.4 ADS1.2集成开发环境的使用,3,ARM指令集总体可分为以下几类,1)数据处理指令:数据传输指令, 算术指令, 逻辑指令, 比较指令,乘法指令, 前导零计数 2)程序状态访问指令:MRS和MSR 3)分支/跳转指令:B、BL和BX 4)访存指令:单数据访存指令,多数据访存指令,信号量操作指令 5)异常中断产生指令:SWI和BKPT 6)协处理器指令,

2、4,3.1 ARM指令集,3.1.1 ARM指令分类及格式 3.1.2 ARM指令寻址方式 3.1.3 常用ARM指令,ARM嵌入式微处理器是基于精简指令集计算机(RISC)原理而设计的,指令集和相关译码机制较为简单。ARM9具有32位ARM指令和16位Thumb指令。,5,3.1.1 ARM指令分类及格式,ARM嵌入式微处理器的指令集是加载、存储型的,即指令集中仅能处理寄存器中的数据,而且处理结果都要写回寄存器中,而对存储器的访问则需要通过专门的加载、存储指令来完成。ARM指令可分为以下六类: 1)数据处理指令:数据传输指令,算术指令,逻辑指令,比较指令,乘法指令,前导零计数 2)程序状态访

3、问指令:MRS和MSR 3)分支指令:B、BL和BX 4)访存指令:单数据访存指令,多数据访存指令,数据交换指令 5)异常产生指令:SWI和BKPT 6)协处理器指令:CDP、LDC、STC、MCR、MRC,图3.1 ARM数据处理类指令编码格式,6,这里以ARM数据处理类指令为例,说明ARM指令格式。ARM数据处理类指令编码基本格式见图3.1所示。ARM数据处理指令基本格式如下:s , , 其中,内的项是必须的,内的项是可选的。如是指令助记符,是必须的,而是指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。 1)cond: 指令的条件码。 2)Opcode: 指令操作码(有1

4、6种编码,对应于16条指令,见下页)。 3)S: 操作是否影响cpsr。 4)Rn: 表示第1个操作数的寄存器编码。 5)Rd: 目标寄存器编码。 6)Operand2: 第2操作数(立即数/寄存器/寄存器移位)。 7)X:1-第2操作数是立即数寻址, 0-第2操作数是寄存器寻址,7,1)Opcode: bit24:21 Operation codes(未含乘法指令)0000 = AND-Rd: = Op1 AND Op20001 = EOR-Rd: = Op1 EOR Op20010 = SUB-Rd: = Op1-Op20011 = RSB-Rd: = Op2-Op10100 = ADD-

5、Rd: = Op1+Op20101 = ADC-Rd: = Op1+Op2+C0110 = SBC-Rd: = OP1-Op2+C-10111 = RSC-Rd: = Op2-Op1+C-11000 = TST-set condition codes on Op1 AND Op21001 = TEQ-set condition codes on OP1 EOR Op21010 = CMP-set condition codes on Op1-Op21011 = CMN-set condition codes on Op1+Op21100 = ORR-Rd: = Op1 OR Op21101 =

6、 MOV-Rd: =Op21110 = BIC-Rd: = Op1 AND NOT Op21111 = MVN-Rd: = NOT Op2,按照图3.1所示的编码格式,操作码Opcode (未含乘法指令)所对应的指令助记符及其含义如下:,8,2)条件码的位数和位置:每条ARM指令包含4位条件码域,它占用指令编码的最高4位31:28。 3)条件码的表示:条件编码共 24 16 种,其中,15种用于指令的条件码。每种条件码用2个英文缩写字符表示。(见P59 表3-1) 4)带条件指令的执行:ARM处理器根据指令的执行条件是否满足,决定当前指令是否执行。只有在cpsr中的条件标志位满足指定的条件时,

7、指令才会被执行。不符合条件的代码依然占用一个时钟周期(相当于一个NOP指令)。5)条件码的书写方法:条件码的位置在指令助记符的后面(因此也称为条件后缀)。例如: MOVEQ R0, R1,9,10,(1) ARM数据处理指令的功能主要完成寄存器中数据的算术和逻辑运算操作。 (2) ARM数据处理指令的特点-操作数来源:所有的操作数要么来自寄存器,要么来自立即数,不会来自存储器。-操作结果:如果有结果,则结果一定是为32位宽、或64位宽(长乘法指令),并且放在一个或两个寄存器中,不会写入存储器。-有第2个操作数(除了乘法指令)Operand2 :切记其三种形式:立即数、寄存器、寄存器移位。-乘法

8、指令的操作数:全部是寄存器。,11,3.1.2 ARM指令寻址方式,所谓寻址方式就是处理器根据指令中给出的地址信息来寻找操作数物理地址的方式。目前ARM处理器支持几种常见的寻址方式。 1寄存器寻址寄存器寻址是指所需要的值在寄存器中,指令中地址码给出的是寄存器编号,即寄存器的内容为操作数。例:ADD R0, R1, R2 ;R0R1+R2,12,2立即寻址立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的地址码部分不是操作数地址,而是操作数本身。 例: ADD R3, R3, #10 ;R3R3+10立即数要以“#”号作前缀,以十进制数10为例:它的16进制立即数为#0xa;它的2进制立即数

9、为#0b1010。关于立即数的构成,可参考图3.2。,图3.2 立即数构成示意图,13,从图3.2可知,有效的立即数可以表示为:=Immed_8 循环右移2 rot位 由于4 位rot移位值的取值 (015)乘于2,得到一个范围在030、步长为 2的移位值。 因此,ARM中的立即数又称为8位位图。我们只需记住一条准则: “最后8位Immed_8移动偶数位”得到立即数。只有通过此构造方法得到的立即数才是合法的。下面是三条带有立即数的MOV 指令及对应的机器码,请注意机器码中的立即数计算: MOV R0, #0xF200 ; E3A00CF2, 0xF200 =0xF2循环右移(2C) MOV R

10、1, #0x110000 ; E3A01811, 0x110000 =0x11循环右移(28) MOV R4, #0x12800 ; E3A04B4A, 0x12800 =0x4A循环右移(2B) 又如,0xFF、0x104(其8位图为0x41)、0xFF0、0xFF00是合法的立即数; 0x101、0x102、0xFF1是非法的立即数。,14,3寄存器移位寻址寄存器移位寻址方式是ARM指令集中所特有的,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。在寄存器移位寻址中,移位的位数可以用立即数或寄存器方式表示。 例: ADD R3, R2, R1, LSL #3 ; R3R2+8

11、R1(即R1中的值向左移3位,与R2中的值相加,结果存入R3) MOV R0,R1,ROR R2 ;R0R1循环右移R2位ARM中有一桶式移位器,途经它的操作数在被使用前能够被移位或循环移位任意位数,这在处理列表、表格和其他复杂数据结构时非常有用。,15,ARM中常用的几种移位操作指令: (1)算术右移ASR存储第二操作数的寄存器算术右移。算术移位的操作数是带符号数,完成移位时应该保持操作数的符号不变。因此,当被移位的操作数为正数时,寄存器的高端空出位补0;当被移位的操作数为负数时,寄存器的高端空出位补1。 (2)逻辑左移LSL存储第二操作数的寄存器逻辑左移。寄存器中的高端送至C标志位,低端空

12、出位补0。 (3)逻辑右移LSR存储第二操作数的寄存器逻辑右移。寄存器中的高端空出位补0。 (4)循环右移ROR存储第二操作数的寄存器循环右移。从寄存器低端移出的位填入到寄存器高端的空出位上。,16,(5)扩展的循环右移RRX存储第二操作数的寄存器进行带进位位的循环右移。每右移一位,寄存器中高端空出位用原C标志位的值填充。若移位的位数由5位立即数(取值范围0-31)给出,就叫作立即数控制移位方式(immediate specified shift);若移位的位数由通用寄存器(不能是R15)的低5位决定,就叫做寄存器控制移位方式(register specified shift) 。关于寄存器控

13、制移位方式,有如下两点需要说明: 1)移位的寄存器不能是PC,否则会产生不可预知的结果。 2)使用寄存器控制移位方式有额外代价(overhead),需要更多的周期才能完成指令,因为ARM没有能力一次读取3个寄存器。立即数控制移位方式则没有上述问题。,17,4寄存器间接寻址寄存器间接寻址是指指令中的地址码给出的是某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在该地址对应的存储单元中,即寄存器为地址指针。 例: LDR R0, R1 ;R0R1 5变址寻址变址寻址(或基址变址寻址)就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数有效地址。变址寻址用于访问基址

14、附近的单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。基址加偏移寻址中的基址寄存器包含的不是确切的地址。基址需加(或减)最大4KB的偏移来计算访问的地址。 例: LDR R0, R1, #4 ; R0R1+4,18,有三种加偏移量(偏移地址)的变址寻址方式: (1)前变址方式(pre-indexed) 先将基地址加上偏移量,生成操作数地址,再做指令指定的操作。该方式不修改基址寄存器。如,上面例子即为此方式。(2)自动变址方式( auto-indexed) 先将基地址加上偏移量,生成操作数地址,再做指令指定的操作;然后再自动修改基址寄存器。 例: LDR R0,

15、 R1, #4! ; R0R14, R1R14 说明:!表示写回或更新基址寄存器。(3)后变址方式(post-indexed) 先将基址寄存器作为操作数地址;完成指令操作后,再将基地址加上偏移量修改基址寄存器。即先用基地址传数,然后再修改基地址(基址+偏移)。 例: STR R0, R1, #12 ; R1R0, R1R112这里R1是基址寄存器。,19,6多寄存器寻址多寄存器寻址是指一条指令可以传送多个寄存器的值,允许一条指令传送16个寄存器的任何子集。 例: LDMIA R1, R0, R2, R5 ; R0R1, R2R1+4, R5R1+8上面指令的含义是将R1所指向的连续3个存储单元

16、中的内容分别送到寄存器R0,R2,R5中。由于传送的数据项总是32位的字,基址R1应该字对准。,20,7堆栈寻址堆栈是一种按特定顺序进行存取的存储区,这种特定顺序即是“先进后出”或“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域。栈指针所指定的存储单元就是堆栈的栈顶。堆栈可分为两种: 1)向上生长:又称递增(Ascending)堆栈,即地址向高地址方向生长。 2)向下生长:又称递减(Decending)堆栈,即地址向低地址方向生长。若SP指向最后压入的堆栈的有效数据单元,称为满堆栈(Full Stack);若SP指向下一个数据项放入的空单元,称为空堆栈(Em

17、pty stack)。,21,ARM处理器支持上面四种类型的堆栈工作方式: 1)满递增堆栈FA(Full Ascending):堆栈指针指向最后压入的数据单元,且由低地址向高地址生成; 2)满递减堆栈FD(Full Descending):堆栈指针指向最后压入的数据单元,且由高地址向低地址生成; 3)空递增堆栈EA(Empty Ascending):堆栈指针指向下一个将要放入数据的空单元,且由低地址向高地址生成; 4)空递减堆栈ED(Empty Descending):堆栈指针指向下一个将要放入数据的空单元,且由高地址向低地址生成;,22,例: STMFD sp!, r4-r7, lr ;将

18、r4r7、lr入栈,满递减堆栈 LDMFD sp!, r4-r7, pc ; 数据出栈,放入r4r7、pc寄存器,图3.3 本例堆栈操作示意图,23,8块拷贝(复制)寻址块拷贝寻址是指把存储器中的一个数据块加载到多个寄存器中,或者是把多个寄存器中的内容保存到存储器中。 1)块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式,因此也叫多寄存器寻址; 2)多寄存器传送指令用于把一块数据从存储器的某一位置拷贝到另一位置; 3)块拷贝指令的寻址操作取决于数据是存储在基址寄存器所指的地址之上还是之下、地址是递增还是递减,并与数据的存取操作有关; 4)块拷贝寻址操作中的寄存器,可以是R0R15这16个寄

19、存器的子集,或是所有寄存器。几种块拷贝指令及其寻址操作说明如下: LDMIA/STMIA:先传送,后地址加4(Increment After); LDMIB/STMIB:先地址加4,后传送(Increment Before); LDMDA/STMDA:先传送,后地址减4 (Decrement After); LDMDB/STMDB:先地址减4,后传送(Decrement Before)。,24,例: STMIA r10, r0, r1, r4; STMIB r10, r0, r1, r4; STMDA r10, r0, r1, r4; STMDB r10, r0, r1, r4;,图3.4 本

20、例的块拷贝寻址操作示意图,25,表3.2 多寄存器load和store指令的堆栈和块拷贝对照,26,9相对寻址相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址,指令中的地址码字段作为偏移量,两者相加后得到操作数的有效地址。偏移量指出的是操作数与当前指令之间的相对位置。子程序调用指令BL即是相对寻址指令。 例: BL ROUTE_A ; 调用ROUTE_A子程序 BEQ LOOP ; 条件跳转到LOOP标号处LOOP MOV R2, #2ROUTE_A: ,27,1、数据传送指令:MOV 、MVN,1)语法 s , # s , s , , LSL # s , , LSL 2)伪代码if

21、ConditionPassed(cond) thenRd = 第2操作数if s = 1 and Rd = pc thencpsr = spsrelse if s = 1 thenset NZCV flags in cpsr,MVN: move negative,3.1.3 常用ARM指令,28,3)MOV指令的功能 寄存器之间传送。 立即数传送到寄存器中(8位立即数位图)。 实现单纯的移位操作。MOV Rd, Rd, LSL, #3 实现子程序调用、从子程序中返回。当PC寄存器作为目标寄存器时可以实现程序跳转。 实现把当前处理器模式的SPSR寄存器内容复制到CPSR中。方法:当PC寄存器作为

22、目标寄存器且指令中S位被设置时,指令在执行跳转操作的同时,将当前处理器模式的SPSR寄存器内容复制到CPSR中。这样可以实现从某些异常中断中返回。例子:MOVS PC,LR,29,mvn意为“取反传送”,它把源寄存器的每一位取反,将得到的结果写入结果寄存器。 对于mov和mvn指令,编译器会进行智能转化。如指令“mov r1, 0xffffff00”中的立即数是非法的。在编译时,编译器将其转化为“mvn r1, 0xff”,这样就不违背立即数的要求。所以对于mov和mvn指令,可以认为:合法的立即数反码也是合法的立即数。,30,4)举例 mov r0, r1 /* r0 = r1,不修改cps

23、r */ mov r0, #0x0 /* r0 = 0,不修改cpsr */ movs r0, #0x0 /* r0 = 0,同时设置cpsr的Z位 */ movs r0, #-10 /* r0 = 0xfffffff6,同时设置cpsr的N位 */ mvn r0, r2 /* r0 = NOT r2,不修改cpsr */ mvn r0, 0xffffffff /* r0 = 0x0,不修改cpsr */ mvns r0, 0xffffffff /* r0 = 0x0,同时设置cpsr的Z位 */ mov r0, r1, LSL #1 /* r0 = r1 r2 */ movs r3,r1,L

24、SL #2 /* r3r12, 影响标志位 */,31,2、算术指令: add、adc、sub、sbc 、 rsb 、rsc,1)语法 s , , # s , , s , , , LSL # s , , , LSL 2)伪代码(以加法add为例)if ConditionPassed(cond) thenRd = Rn + 第2操作数if s = 1 and Rd = pc thencpsr = spsrelse if s = 1 thenset NZCV flags in cpsr,RSB: Reverse Subtract RSC: Reverse Subtract with Carry,3

25、2,说明: ADD,SUB,RSB不带进位或借位 ADC,SBC ,RSC带进位或借位。其句法是: op cond S Rd,Rn,Operand2 ADD指令用于将Rn和Operand2的值相加; SUB指令用于从Rn的值中减去Operand2的值; RSB指令用于从Operand2的值中减去Rn的值;,33,ADC指令用于将Rn和Operand2的值相加,再加上进位标志C的值; SBC指令用于从Rn的值中减去Operand2的值,若进位标志C为0,结果再减1; RSC指令用于从Operand2的值中减去Rn的值,若进位标志C为0,结果再减1。 以上指令执行的结果均存于Rd中。 S为可选的后

26、缀。若指定S,则根据操作结果更新条件码标志,34,注意: 若在这些指令后面加上后缀S,那么这些指令将根据其运算结果更新标志N,Z,C和V。 若R15作为Rn使用,则使用的值是当前指令的地址加8。 若R15作为Rd使用,则执行完指令后,程序将转移到结果对应的地址处。若此时指令还加有后缀S,则还会将当前模式的SPSR拷贝到CPSR。可以使用这一点从异常返回。 在有寄存器控制移位的任何数据处理指令中,不能将R15作为Rd或任何操作数来使用。,35,例: ADD R3,R7,#1020 ;immed_8r为1020(0x3FC),是0xFF循环右移30位 SUBS R8,R6,#240 ;R8R6-2

27、40,运算完成后将根据结果更新标志 RSB R4,R4,#1280 ;R41280-R4 RSCLES R0,R5,R0,LSL R4 ;有条件执行,执行完后更新标志,36,3、逻辑指令,1)AND,ORR,EOR和BIC指令 2)逻辑与、或、异或等指令。其句法是: op cond S Rd,Rn,Operand2 其中所用到的符号意义与前述的相同。 3)AND,ORR和EOR指令分别完成按位将Rn和Operand2的值进行“与”、“或”和“异或”操作,结果存于Rd中。BIC指令用于将Rn中的各位与Operand2的相应位的反码进行“与”操作,结果存于Rd中。,37,4)使用这些指令时应注意:

28、若加有后缀S,这些指令执行完后将根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。如: EORS R0, R0, R3, ROR R6BICNES R8, R10, R0, RRX,38,逻辑运算指令举例: ANDS R0, R0, #0x01 ; R0R0 将R1的低4位清0,;其它位不变 BIC指令可用于将寄存器中某些位的值设置成0。将某一位与1做BIC操作,该位值被设置成0;将某一位与0做BIC操作,该位值不变。,39,4、比较指令,1)CMP和CMN指令 2)比较和比较反值指令。其句法如下: op cond Rn,Operand2 其中所用到的符号意义与上述的相

29、同。 3)CMP指令从Rn的值中减去Operand2的值。除结果被舍弃外,其他与SUBS指令一样; 4)CMN(Compare Negative)指令将Operand2的值加到Rn的值中,除结果被舍弃外,其他与ADDS指令一样。CMP和CMN指令执行后均根据结果更新标志N、Z、C和V。,CMN: Compare Negative,40,5)例:CMP R2,R9 ; N、Z、C、VR2-R9CMN R0,#6400 ; N、Z、C、V#6400-R0CMPGT R13,R7,LSL #2 ;带符号大于,41,5、TST和TEQ指令 1)测试和测试相等指令,其句法如下: op cond Rn,O

30、perand2 其中所用到的符号意义与上述的相同。 2)TST指令对Rn的值和Operand2的值进行按位与,除结果被舍弃外,其他与ANDS指令一样; 3)TEQ指令对Rn的值和Operand2的值进行按位异或,除结果被舍弃外,其他与EORS指令一样。 4)TST和TEQ指令执行后均根据结果更新标志N、Z、C和V。,42,例:TST R0, #0x01 ;判断R0的最低位是否为0TST Rl, #0x0F ;判断R1的低4位是否为0TEQ R0,R1 ;比较R0与R1是否相等;(不影响V位和C位)TST指令通常与EQ、NE条件码配合使用。当所有测试位均为0时,EQ有效。而只要有一个测试位不为0

31、,则NE有效。TSTNE R1,R5,ASR R1TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用TEQ进行相等测试时,常与EQ、NE条件码配合使用。当两个数据相等时,EQ有效;否则NE有效。TEQEQ R10,R9,43,6、乘法指令(*:了解),ARM有两类乘法指令: 1)32位的乘法指令,即乘法操作的结果为32位; 2)64位的乘法指令,即乘法操作的结果为64位。,44,45,(1) MUL32位乘法指令指令格式: MULcondS Rd, Rm, Rs;RdRm*RsMUL指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。指令举例:MUL R1, R2, R3 ;

32、 R1=R2R3MULS R0, R3, R7 ; R0=R3R7,; 设置CPSR的N位和Z位,46,(2) MLA32位乘加指令指令格式: MLAcondS Rd, Rm, Rs, Rn; RdRm*Rs+Rn MLA指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低32位保存到Rd中。指令举例: MLA R1, R2, R3, R0 ; R1=R2xR3+R0,47,(3) UMULL64位无符号乘法指令指令格式:UMULLcondS RdLo, RdHi, Rm, Rs; RdHi, RdLoRm*RsUMULL指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到Rd

33、Lo中,高32位保存到RdHi中。指令举例:UMULL R0, R1, R5, R8; (R1,R0)R5R8,48,(4) UMLAL64位无符号乘加指令指令格式:UMLALcondS RdLo, RdHi, Rm, Rs; RdHi, RdLo Rm*Rs+ RdHi, RdLoUMLAL指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令举例:UMLAL R0, R1, R5, R8 ;(R1,R0)R5R8+(R1,R0),49,(5) SMULL64位有符号乘法指令指令格式: SMULLcondS

34、RdLo, RdHi, Rm, Rs; RdHi, RdLo Rm*RsSMULL指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令举例:SMULL R2, R3, R7, R6; (R3,R2)R7xR6,50,(6) SMLAL64位有符号乘加指令指令格式: SMLALcondS RdLo, RdHi, Rm, Rs; RdHi, RdLo Rm*Rs+ RdHi, RdLoSMLAL指令将Rm和Rs中的值作有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,高32位保存到RdHi中。指令举例:SMLAL R

35、2, R3, R7, R6; (R3,R2)R7R6+(R3,R2),51,(7)乘法指令的特点1) 不支持第2操作数为立即数。 2) 结果寄存器不能与第1源寄存器相同。 Rd、RdHi、RdLo不能与Rm为同一寄存器。 RdHi和RdLo不能为同一寄存器。 3) 避免将R15定义为任一操作数或结果寄存器。 4) 早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。,52,5) 对标志位的影响 对N标志位:对有符号数乘法,若结果是32位指令形式,Rd的第31位是标志位N;对于产生长结果的指令形式,RdHi的第31位是标志位。 对Z标志位:如果R

36、d或RdHi、RdLo为0,则标志位Z置位。 对V标志位:乘法指令不影响V标志位。 对C标志位: ARM v5及以上的版本不影响C标志位; ARM v5以前的版本,C标志位数值不确定。,53,53,7、程序状态访问指令,1)当需要修改cpsr/spsr的内容时,首先要读取它的值到一个通用寄存器,然后修改某些位,最后将数据写回到状态寄存器(即:修改状态寄存器一般是通过“读取修改写回”三个步骤的操作来实现的)。 2)cpsr/spsr不是通用寄存器,不能使用mov指令来读写。在ARM处理器中,只有mrs指令可以读取cpsr/spsr;只有msr可以写cpsr/spsr。,54,图 ARM状态寄存器

37、的格式,条件码标志位(保存ALU中的当前操作信息) N:正负号/大小 标志位0表示:正数/大于;1表示:负数/小于 Z:零标志位0表示:结果不为零;1表示:结果为零 C:进位/借位/移出位0表示:未进位/借位/移出0;1表示:进位/未借位/移出1 V:溢出标志位0表示:结果未溢出;1表示:结果溢出 Q:DSP指令溢出标志位(用于v5以上E系列)0表示:结果未溢出;1表示:结果溢出,55,55,1. mrs-读状态寄存器指令 (Move PSR status/flags to register),指令格式如下:MRScond Rd,psr ; Rd psr 把状态寄存器psr(CPSR或SPSR

38、)的内容传送到目标寄存器中。 其中: Rd 目标寄存器。Rd不允许为R15。psr CPSR或SPSR。注意:在ARM处理器中,只有MRS指令可以将状态寄存器CPSR或SPSR读出到通用寄存器中。,56,56,MRS指令举例:MRS R1,CPSR ; R1 CPSRMRS R2,SPSR ; R2 SPSRMRS与MSR指令的应用目的: 1)获得CPSR或SPSR的状态:用MRS指令读取CPSR,可用来判断ALU的状态标志,或IRQ、FIQ中断是否允许等。用MRS指令在异常处理程序中,读SPSR可知道进行异常前的处理器状态等。 2)CPSR或SPSR进行修改:MRS与MSR配合使用,实现CP

39、SR或SPSR寄存器的读修改写操作,可用来进行处理器模式切换、允许/禁止IRQ/FIQ中断等设置。,57,57,2. MSR写状态寄存器指令(Move register to PSR status/flags)在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR。指令格式:MSRcond psr_fields,#immedMSRcond psr_fields,Rm其中: psr: CPSR或SPSR。. immed: 要传送到状态寄存器指定域的8位立即数。. Rm: 要传送到状态寄存器指定域的数据的源寄 存器。,58,58,1)fields 指定传送的区域。fields可以

40、是以下的一种或多种(字母必须为小写): c 控制域 (psr70); x 扩展域(psr158);(暂未用) s 状态域 (psr2316);(暂未用) f 标志位域 (psr3124)。,59,59,写状态寄存器指令msr的二进制编码格式,60,2)指令举例:MSR CPSR_f,#0xf0 ;CPSR31:280xf(0b1111) ;即N,Z,C,V均被置1。修改状态寄存器一般是通过“读取修改写回”三个步骤的操作来实现的。CPSR的读修改写操作举例:例1:设置进位位CMRS R0, CPSR ;R0CPSR ORR R0,R0,#0x20000000 ;置1进位位CMSR CPSR_f,

41、 R0 ;CPSR_fR031:24例2:从管理模式切换到IRQ模式MRS R0, CPSR ;R0CPSRBIC R0,R0,#0x1f ;低5位清零ORR R0,R0,#0x12 ;设置为IRQ模式(P50表2-3)MSR CPSR_c, R0 ;传送回CPSR例3: MSR CPSR_c, #0xd3 ;切换到SVC模式 MSR CPSR_cxsf, R3 ;CPSR = r3,61,注意: 1)控制域的修改问题:只有在特权模式下才能修改状态寄存器的控制域7:0,以实现处理器模式转换,或设置开/关异常中断 。 2)T控制位的修改问题:程序中不能通过MSR指令,直接修改CPSR中的T控制位

42、来实现ARM状态Thumb状态的切换,必须使用BX指令完成处理器状态的切换。 3)用户模式下能够修改的位:在用户模式只能修改“标志位域”,不能对CPSR23:0做修改。 4)S后缀的使用问题:在MRS/MSR指令中不可以使用S后缀。,62,8、跳转/分支指令,1) B转移指令指令格式:Bcond labelB指令跳转到指定的地址执行程序。指令举例:B WAITA ; 跳转到WAITA标号处B 0x1234 ; 跳转到绝对地址0x1234处转移指令B限制在当前指令的32 MB的范围内。,63,举例:无条件跳转:B labellabel 执行10次循环:MOV R0, #10LOOPSUBS R0

43、,R0, #1BNE LOOP ; z=0转LOOP,64,2.)BL带链接的转移指令指令格式如下:BLcond labelBL指令先将下一条指令的地址拷贝到LR 链接寄存器中,然后跳转到指定地址运行程序。指令举例:BL SUB1 ; LR下条指令地址; 转至子程序SUB1处 SUB1 MOV PC, LR ; 子程序返回注意:转移地址限制在当前指令的32 MB的范围内。BL指令常用于子程序调用。,65,例子:根据不同的条件,执行不同的子程序。CMP R1, #5BLLT ADD11 ;有符号数 BLGE SUB22 ;有符号数 ADD11 SUB22 注:如果R15,只有ADD11不改变条件

44、码,本例才能正常工作。,66,例子:BL SUB1 SUB1 STMFD SP!, R0-R3,R14BL SUB2 SUB2 注意:在保存R14之前子程序不应再调用下一级的嵌套子程序。否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。,67,3) BX带状态切换的转移指令指令格式:BXcond Rm 功能:PC=Rm&0xfffffffe, T=Rm0&1BX指令跳转到Rm指定的地址执行程序。若Rm的位0为1,则跳转时自动将CPSR中的标志T置位,即把目标地址的代码解释为Thumb代码;若Rm的位0为0,则跳转时自动将CPSR中的标志T复位,即把目标地址的代码解释为ARM代

45、码。,68,举例:ADR R0,THUMBCODE+1 ; 将R0的bit0置1BX R0 ; 跳转,并根据R0的bit0实现状态切换CODE16 ;16位Thumb代码 THUMBCODE MOV R2,#2ADR R0,ARMCODE ;加载ARMCODE地址到R0中BX R0CODE32 ;32位ARM代码 ARMCODE MOV R4,#4,69,9、访存指令(数据加载与存储器指令): 1、单数据访存指令 2、多数据访存指令 3、数据交换/信号量操作指令,70,1、单数据访存指令,1)第一类: 读写字: ldr / str 读写无符号字节: ldrb / strb 2)第二类: 读写无

46、符号半字: ldrh / strh 读有符号半字: ldrsh 读有符号字节: ldrsb,ldr: load register from memory str: store register to memory,71,第一类指令的指令格式,72,第一类指令的语法,1)语法 ldr|strb , , #+b , , +! ldr|strb , , +, #! ldr|strb , , #+b , , + ldr|strb , , +, # 2)举例 ldrb r0, r1, #+0xfff ; 把r1+0xfff地址的字节读入r0 ldr r0, r1, +r2! ;把r1+r2地址的32比特

47、数读入r0,然后r1= r1+r2 str r0, r1, +r2, LSL #31 ;把r0(32bit)写到地址r1+(r231) ldr r0, r1, #+0xfff ;把r1地址的数读入r0,然后r1=r1+0xfff ldr r0, r1, +r2 ; 把r1地址的数读入r0,然后r1=r1+r2 ldr r0, r1, +r2, LSL #31 ; 把r1地址的数读入r0,然后r1=r1+(r231),73,3)说明 ldr/str 读/写一个32bit字到/从一个32bit的寄存器,要求读/写地址字对齐。 ldrb:读一个8bit字节到一个32bit的寄存器,不要求地址对齐,寄

48、存器的高24位清零。 strb:将寄存器的低8位,写入内存的某个地址。不要求地址对齐。,74,第二类指令,1)读写无符号半字: ldrh / str 2)读有符号半字: ldrsh 3)读有符号字节: ldrsb,75,指令汇总: 1)LDR 字数据读取指令 2)LDRH 字节数据读取指令 3)LDRBT 用户模式的字节数据读取指令 4)LDRH 半字数据读取指令 5)LDRSB 有符号的字节数据读取指令 6)LDRSH 有符号的半字数据读取指令 7)LDRT 用户模式的字数据读取指令 8)STR 字数据写入指令 9)STRB 字节数据写入指令 10)STRBT 用户模式字节数据写入指令 11)STRH 半字数据写入指令 12)STRT 用户模式字数据写入指令,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报