第6讲_ARM指令系统_第1页
第6讲_ARM指令系统_第2页
第6讲_ARM指令系统_第3页
第6讲_ARM指令系统_第4页
第6讲_ARM指令系统_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2q ARMARM体系结构包含一个当前程序状态寄存器(体系结构包含一个当前程序状态寄存器(CPSRCPSR)和五)和五个备份的程序状态寄存器(个备份的程序状态寄存器(SPSRSPSR)。备份的程序状态寄存)。备份的程序状态寄存器用来进行异常处理,其功能包括:器用来进行异常处理,其功能包括: 保存保存ALUALU中的当前操作信息中的当前操作信息 控制允许和禁止中断控制允许和禁止中断 设置处理器的运行模式设置处理器的运行模式3NZCV IM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0条件代码标志条件代码标志保留保留控制位控制位溢出标志溢出标

2、志 oVerflow进位或借位扩展进位或借位扩展 Carry零零 Zero负或小于负或小于 NegativeI IRQ禁止禁止 InterruptFIQ禁止禁止 Fast状态位状态位 Thumb模式位模式位 ModeNZCVIM0M1M2M3M4TF 寄存器格式寄存器格式4标志位标志位含含 义义N N当用两个补码表示的带符号数进行运算时,当用两个补码表示的带符号数进行运算时,N=1 N=1 表示运算的结果为表示运算的结果为负数;负数;N=0 N=0 表示运算的结果为正数或零;表示运算的结果为正数或零;Z ZZ=1 Z=1 表示运算的结果为零;表示运算的结果为零;Z=0Z=0表示运算的结果为非零

3、;表示运算的结果为非零;C C加法运算结果进位时,加法运算结果进位时,C=1C=1,减法运算借位时,减法运算借位时,C=0C=0;移位操作的非加移位操作的非加/ /减运算指令,减运算指令,C C为移出的最后一位;为移出的最后一位;其他的非加其他的非加/ /减运算指令,减运算指令,C C的值通常不改变。的值通常不改变。V V加加/ /减法运算指令,减法运算指令,V=1V=1表示符号位溢出。表示符号位溢出。对于其他的非加对于其他的非加/ /减运算指令,减运算指令,C C的值通常不改变。的值通常不改变。Q Q在在ARM v5ARM v5及以上版本的及以上版本的E E系列处理器中,系列处理器中,Q Q

4、标志指示标志指示DSPDSP运算指令是运算指令是否溢出。在其他版本中,否溢出。在其他版本中,Q Q标志位无定义。标志位无定义。5p中断禁止位中断禁止位包括包括I I和和F F位:位:当当I I位置位时,位置位时,IRQIRQ中断被禁止;中断被禁止;当当F F位置位时,位置位时,FIQFIQ中断被禁止。中断被禁止。pT T位位反映了正在操作的状态:反映了正在操作的状态:当当T T位为位为1 1时,处理器正在时,处理器正在ThumbThumb状态下运行;状态下运行;当当T T位清零时,处理器正在位清零时,处理器正在ARMARM状态下运行。状态下运行。 控制位控制位6M4:0模式模式可访问的可访问的

5、Thumb状态寄存器状态寄存器可访问的可访问的ARM状态寄存器状态寄存器10000用户R0R7,SP,LR,PC,CPSRR0R14,PC, CPSR 10001快中断R0R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiq R0R7,R8_fiqR14_fiq,PC,CPSR, SPSR_fiq 10010中断R0R7,SP_irq,LR_irq,PC,CPSR, SPSR_fiq R0R12,R13_irq,R14_irq,PC,CPSR, SPSR_irq 10011管理R0R7,SP_svc,LR_svc,PC,CPSR, SPSR_svc R0R12,R13_svc,R

6、14_svc,PC,CPSR, SPSR_svc 10111中止R0R7,SP_abt,LR_abt,PC,CPSR, SPSR_abt R0R12,R13_abt,R14_abt,PC,CPSR, SPSR_abt 11011未定义R0R7,SP_und,LR_und,PC,CPSR, SPSR_und R0R12,R13_und,R14_und,PC,CPSR,SPSR_und11111系统R0R7,SP,LR,PC,CPSR R0R14,PC, CPSR 模式位模式位7ARMARM指令长度指令长度 指令集可以是以下任一种指令集可以是以下任一种 32 bits 32 bits 长长 ( (

7、ARMARM状态状态) ) 16 bits 16 bits 长长 ( (Thumb Thumb 状态状态) ) ARM9ARM9支持支持3 3种数据类型种数据类型 字节字节 (8-bit)(8-bit) 半字半字 ( (16-bit)16-bit) 字字 (32-bit)(32-bit) 字字必须被排成必须被排成4 4个字节边界对齐个字节边界对齐 半字半字必须被排列成必须被排列成2 2个字节边界对齐个字节边界对齐8 向后兼容向后兼容:新版本增加指令,并保持指令向后兼容;:新版本增加指令,并保持指令向后兼容; Load/store Load/store 结构结构pload/store load/

8、store 从存储器中读某个值从存储器中读某个值, ,操作完后再将操作完后再将其放回存储器中其放回存储器中p只对存放在寄存器的数据进行处理只对存放在寄存器的数据进行处理p对于存储器中的数据,只能使用对于存储器中的数据,只能使用load/storeload/store指令指令进行存取进行存取910 寻址方式寻址方式是根据指令中给出的地址码字段来实现寻是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。找真实操作数地址的方式。ARMARM处理器具有处理器具有9 9种基本寻址种基本寻址方式:方式:1 1)寄存器寻址;)寄存器寻址;2 2)立即寻址;)立即寻址;3 3)寄存器移位寻址;)寄存器

9、移位寻址;4 4)寄存器间接寻址;)寄存器间接寻址;5 5)基址寻址;)基址寻址;6 6)多寄存器寻址;)多寄存器寻址;7 7)堆栈寻址;)堆栈寻址;8 8)块拷贝寻址;)块拷贝寻址;9 9)相对寻址。)相对寻址。11 操作数的值在寄存器中,指令中的地址码字段指操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:操作。寄存器寻址指令举例如下: MOV R1,R2 ;将将R2的值存入的值存入R1 SUB R0,R1,R2 ;将将R1的值减去的值减去R2的值,结果保存到的值,结果保存到R

10、0 0 xAA0 x55R2R1MOV R1,R20 xAA12 立即寻址指令中的操作码字段后面的地址码部分立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数取出指令也就取出了可以立即使用的操作数( (这样的这样的数称为立即数数称为立即数) )。立即寻址指令举例如下:。立即寻址指令举例如下: SUBSR0,R0,#1 ;R0减减1,结果放入,结果放入R0,并且影响标志位,并且影响标志位MOVR0,#0 xFF000 ;将立即数将立即数0 xFF000装入装入R0寄存器寄

11、存器 0 x55R0MOV R0,#0 xFF00程序存储MOV R0,#0 xFF000 xFF00从代码中获得数据从代码中获得数据13 寄存器移位寻址是寄存器移位寻址是ARMARM指令集特有的寻址方式。当指令集特有的寻址方式。当第第2 2个操作数是寄存器移位方式时,第个操作数是寄存器移位方式时,第2 2个寄存器操作数个寄存器操作数在与第在与第1 1个操作数结合之前,选择进行移位操作。寄存器个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:移位寻址指令举例如下:MOVR0,R2,LSL #3 ;R2的值左移的值左移3位,结果放入位,结果放入R0, ;即是即是R0=R28 AND

12、SR1,R1,R2,LSL R3 ;R2的值左移的值左移R3位,然后和位,然后和R1相相 ;“与与”操作,结果放入操作,结果放入R10 x55R0R20 x01MOV R0,R2,LSL #30 x080 x08逻辑左移逻辑左移3位位0 LSL逻辑左移 :Rx,LSL (Logical Shift Left) LSR逻辑右移 : Rx,LSR (Logical Shift Right) ASR算术右移 :Rx,ASR (Arithmetic Shift Right) ROR循环右移 :Rx,ROR (Rotate Right) RRX带扩展的循环右移:Rx,RRX (Rotate Right

13、with extend)0C031 31 31 31 31 000015 寄存器间接寻址指令中的地址码给出的是一个寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:针。寄存器间接寻址指令举例如下: LDRR1,R2;将将R2指向的存储单元的数据读出指向的存储单元的数据读出;保存在保存在R1中中 SWPR1,R1,R2;将寄存器将寄存器R1的值和的值和R2指定的存储指定的存储;单元的内容交换单元的内容

14、交换 0 x55R0R2 0 x400000000 xAA0 x40000000LDR R0,R20 xAA 基址寻址就是将基址寄存器的内容与指令中给出的基址寻址就是将基址寄存器的内容与指令中给出的偏移量(偏移量(4K4K)相加)相加/ /减,形成操作数的有效地址。基址减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为量为0 0的基址加偏移寻址。的基址加偏移寻址。LDRR2,R3,#0 x0C ;读取读取R3+0 x0C

15、地址上的存储单元地址上的存储单元 ;的内容,放入的内容,放入R2 STRR1,R0,#-4! ;先先R0=R0-4,然后把,然后把R0的值寄存的值寄存 ;到保存到到保存到R1指定的存储单元指定的存储单元 160 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0C0 xAA将将R3+0 x0C作作为地址装载数为地址装载数据据17 多寄存器寻址一次可传送几个寄存器值,允许一多寄存器寻址一次可传送几个寄存器值,允许一条指令传送条指令传送1616个寄存器的任何子集或所有寄存器。多个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:寄存器寻址指令

16、举例如下: LDMIAR1!,R2-R7,R12 ;将将R1指向的单元中的数据读出到指向的单元中的数据读出到 ;R2R7、R12中中(R1自动加自动加4) STMIAR0!,R2-R7,R12 ;将寄存器将寄存器R2R7、R12的值保的值保 ;存到存到R0指向的存储单元中指向的存储单元中 ;(R0自动加自动加4)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器LDMIA R1!,R2-R4,R6 0 x010 x020 x030 x04

17、0 x4000001018 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: p向上生长:向高地址方向生长,称为递增堆栈p向下生长:向低地址方向生长,称为递减堆栈19栈底栈底栈顶栈顶栈区栈区SP堆栈存储区栈顶栈顶栈底栈底栈区栈区SP向下增长向上增长0 x123456780 x12345678堆栈压栈堆栈压栈20栈顶SP栈顶SP栈底空堆栈栈底满堆栈 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈

18、。 0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈21因此,可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。 22 快拷贝寻址用于将一块数据从存储器的某一位置拷贝到另一位置。 如:STMIAR0!,R1-R7;将

19、R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之后增加,;增长方向为向上增长。STMIBR0!,R1-R7;将R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之前增加,;增长方向为向上增长。 23 多寄存器加载多寄存器加载/ /存储指令的存储指令的8 8种模式如下表所示,右边四种为堆栈种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。操作、左边四种为数据传送操作。模式说明模式说明IA每次传送后地址加4FD满递减堆栈IB每次传送前地址加4ED空递减堆栈DA每次传送后地址减4FA满递增堆栈DB每次传送前地址减4EA空递增堆栈数据块传送操作堆栈操作 进行数据复制时,

20、先设置好源数据指针和目标指针,然后使用块进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令拷贝寻址指令LDMIA/STMIALDMIA/STMIA、LDMIB/STMIBLDMIB/STMIB、LDMDA/STMDALDMDA/STMDA、LDMDB/STMDBLDMDB/STMDB进行读取和存储进行读取和存储 。 进行堆栈操作操作时,要先设置堆栈指针(进行堆栈操作操作时,要先设置堆栈指针(SPSP),然后使用堆栈),然后使用堆栈寻址指令寻址指令STMFD/LDMFD STMFD/LDMFD 、STMED/LDMEDSTMED/LDMED、STMFA/LDMFASTMFA/L

21、DMFA和和STMEA/LDMEASTMEA/LDMEA实现堆栈操作。实现堆栈操作。24数据块传送存储堆栈操作压栈说明数据块传送加载堆栈操作出栈说明STMDASTMED空递减LDMDALDMFA满递减STMIASTMEA空递增LDMIALDMFD满递增STMDBSTMFD满递减LDMDBLDMEA空递减STMIBSTMFA满递增LDMIBLDMED空递增;使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆栈指令进行堆栈操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R6 两段代码的执行结果是一样的,但是使用堆栈指令的压

22、栈和出栈两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。和出栈操作则需要考虑空与满、加与减对应的问题。25 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处.LOOPMOVR6,#1.SUBR1. 2627;文件名:TEST1.S ;功能:实

23、现两个寄存器相加 ;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件结束 使用“;”进行注释标号顶格写实际代码段声明文件结束u 一个简单的一个简单的ARMARM程序程序282931-2827-2524

24、-212019-1615-1211-000000010100100010000000000001000condopcodeRnRdOp2【例例】ADDEQS R0,R1,#8条件码域条件码域操作代码域操作代码域(第一个操作数)源寄存器(第一个操作数)源寄存器目标寄存器目标寄存器第二个操作数第二个操作数 ARM ARM是三地址指令格式,指令的基本格式如下:是三地址指令格式,指令的基本格式如下: S , 其中号内的项是必须的,号内的项是可选的。各项的说明如下:opcode:指令助记符/操作码; cond:指令执行的条件;S:执行结果是否影响CPSR寄存器的值;Rd:目标寄存器; Rn:第1个操作数

25、的寄存器;Op2:第2个操作数(立即数、寄存器或移位操作数)。指令语法目标寄存器(Rd) 源寄存器1(Rn)源寄存器2(Rm)ADD r3,r1,r2r3r1r231 条件码:条件码: S , 使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。 所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。32 条件码:条件码:操作码操作码条件助记符条件助记符标志标志含义含义0000EQZ=1相等相等0001NEZ=0不相等不相等0010CS/HSC=1无符号数大于或等于无符号数大于或等于

26、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任何任何从不执行

27、从不执行(不要使用不要使用) 33C C代码代码:If(a b)a+;Elseb+;对应的汇编代码对应的汇编代码:CMPR0,R1 ;R0(a)与)与R1(b)比较)比较ADDHI R0,R0,#1 ;若若R0R1,则,则R0=R0+1ADDLS R1,R1,#1 ;若若R011,则,则R1=R1+1R1=R1+1示例:示例: 条件码:条件码:HI:C置位、置位、Z清零,无符号数清零,无符号数大于大于LS:C清零、清零、Z置位,置位,小于或等于小于或等于34q ARM微处理器的指令集是微处理器的指令集是加载加载/存储存储型的,也即指令集仅型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载而对系统存储器的访问则需要通过专门的加载/存储指令存储指令来完成。来完成。q ARM微处理器的指令集可以分为微处理器的指令集可以分为六大类六大类 : 跳转指令跳转指令 数据处理指令数据处理指令 程序状态寄存器(程序状态寄存器(PSR)处理指令)处理指令 加载加载/存储指令存储指令 协处理器指令协处理器指令 异常产生指令异常产生指令助记符助记符指令功能描述指令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论