第4章arm指令分类及寻址方式

上传人:今*** 文档编号:110165993 上传时间:2019-10-29 格式:PPT 页数:42 大小:1.06MB
返回 下载 相关 举报
第4章arm指令分类及寻址方式_第1页
第1页 / 共42页
第4章arm指令分类及寻址方式_第2页
第2页 / 共42页
第4章arm指令分类及寻址方式_第3页
第3页 / 共42页
第4章arm指令分类及寻址方式_第4页
第4页 / 共42页
第4章arm指令分类及寻址方式_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《第4章arm指令分类及寻址方式》由会员分享,可在线阅读,更多相关《第4章arm指令分类及寻址方式(42页珍藏版)》请在金锄头文库上搜索。

1、1,4,C H A P T E R,ARM指令分类 及寻址方式,2,1,3,2,ARM 微处理器指令的分类,ARM 微处理器指令的寻址方式,ARM 微处理器指令的条件域,内容组织,C语言和汇编语言混合编程,4,3,4.1 ARM微处理器的指令系统,ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM微处理器的指令集可以分为六大类 : 跳转指令 数据处理指令 程序状态寄存器(PSR)处理指令 加载/存储指令 协处理器指令和异常产生指令,一、 ARM 微处理器指令的分类,4,ARM

2、微处理器指令表-1,5,ARM微处理器指令表-2,6,ARM微处理器指令表-3,7,ARM微处理器指令表-4,8,ARM微处理器指令表-5,9,当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。,二、ARM 微处理器指令的条件域,10,

3、指令的条件域表-1,11,指令的条件域表-2,12,4.2 ARM指令的寻址方式,ARM指令系统支持如下几种常见的寻址方式: 立即寻址 寄存器寻址 寄存器间接寻址 基址变址寻址 多寄存器寻址 相对寻址 堆栈寻址,13,立即寻址,立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令: ADD R0,R0,1 /*R0R01*/ ADD R0,R0,0x3f /*R0R00x3f*/ 在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求

4、在“”后加上“0x”。,14,寄存器寻址,寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令: ADD R0,R1,R2 /*R0R1R2*/ 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。,15,寄存器间接寻址,寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: LDR R0,R1 /*R0R1*/ STR R0,R1 /*R1R0*/ 第一条指令将以R1的值为地址的存储器中的数据传送到R0中。 第二条指令将R0的值传送到以R1的值为地址的存储

5、器中。,16,基址变址寻址,基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示: LDR R0,R1,4 ;R0R14 LDR R0,R1,4! ;R0R14、R1R14 LDR R0,R1 ,4 ;R0R1、R1R14 LDR R0,R1,R2 ;R0R1R2 在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。 在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作

6、数存入寄存器R0中,然后,R1的内容自增4个字节。 在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。 在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。,17,多寄存器寻址,18,采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令: LDMIA R0!,R3-R9 ;取出R0所指向的多个单元数据,保存到R3R9中,R0值更新 STMIA R1!, R3-R9,R11 ;将R3R9、R11的数据

7、存储到R1所指向的单元中,R1值更新 STMFD SP!,R0-R7,LR ;保护现场,将R0-R7、LR入栈 LDMFD SP!,R0-R7,PC ;恢复现场,异常处理返回 该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1R4。 后缀相应有IB、DA、DB、FD、FA、ED、EA。,19,ARM 指令的寻址方式,20,相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式: BL N

8、EXT ;跳转到子程序NEXT处执行 NEXT MOV PC,LR ;从子程序返回,21,堆栈寻址,堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。,22,堆栈寻址,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈

9、,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成,23,24,软件中断指令SWI:,指令格式为: SWI条件 24位的立即数 SWI指令为软件中断指令,用于产生软件中断,从而实现在用 户模式下切换到管理模式下,CPSR保存到管理模式的SPSR 中,执行转

10、移到SWI向量。在其他模式下也可使用SWI指令, 处理器同样切换到管理模式。,25,第一种方法:指令中24位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。 MOV R0,34 ;设置子功能号为34 SWI 12 ; 调用12号软中断,第二种方法:指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其他的通用寄存器传递。 MOV R0,12 ;调用12号软中断 MOV R1,34 ;设置子功能号为34 SWI 0,26,在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到

11、;然后要取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出指令,分解出立即数。下面所示的程序段可用来读取SWI立即数。,27,T_BIT EQU 0x20 SWI_Handler ;SWI异常中断进入 STMFD SP!,R0-R3,R12,LR ;现场保护 MRS R0,SPSR ;读取SPSR STMFD SP!,R0 ;保存SPSR TST R0,T_BIT ;测试T标志位 LDRNEH R0,R0,2 ;若是Thumb指令,读取指令码(16位) BICNE R0,R0,0xFF00 ;取得Thumb指令的8位立即数 LDREQ R0,LR,4 ;若是ARM指令,读取指令码(3

12、2位) BICEQ R0,R0,0xFF000000 ;取得ARM指令的24位立即数 LDMFD SP!, R0-R3,R12,PC ;SWI异常中断返回,28,C语言和汇编语言混合编程,混合编程包括: 在C/C+代码中嵌入汇编指令; 在汇编程序和C/C+程序之间实现变量的互访; 汇编程序、 C/C+程序间的相互调用。,29,在C/C+代码中嵌入汇编指令,内嵌汇编语言的语法为: _asm 汇编指令 /*注释*/ 汇编指令 ,30,void Disable_IRQ(void) _asm MRS R4, CPSR ORR R4, R4, #0x80 MSR CPSR_c, R4 ,禁止IRQ中断:

13、,不能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现; 使用物理寄存器的指令中,不要使用过于复杂的C表达式。,注意:,31,编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时,可能会将寄存器R0R3、R12和LR用于子程序调用。因此,在内嵌汇编语言程序时,不要将这些寄存器同时指定为汇编指令中的物理寄存器。,32,汇编程序访问C变量,在C程序中声明的全局变量可以被汇编程序访问。汇编程序 访问方法为:使用IMPORT伪指令引入全局变量,并利用 LDR或STR指令根据全局变量的地址访问它们 。,unsigned char :LDRB/STRB unsigned short

14、:LDRH/STRH unsigned int :LDR/STR char :LDRSB/STRSB short :LDRSH/STRSH,33,AREA globals,CODE,READONLY EXPORT asmsub IMPORT globv1 asmsub LDR R1,globv1 LDR R0,R1 ADD R0,R0,2 STR R0,R1 MOV PC,LR END,程序中变量globv1是在C程序中声明的全局变量,汇编程序实现将其读出,加2后在送回保存。,34,C与汇编程序相互调用,在C程序和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-THUMB procedu

15、re call standard )。PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。,汇编语言子程序必须满足下面3个条件: 1)在子程序编写时必须遵守相应的ATPCS规则; 2)堆栈的使用要遵守相应的ATPCS规则; 3)在汇编编译器中使用-apcs选项。,35,寄存器的使用必须满足下面的规则: 1)子程序间通过寄存器R0R3来传递参数。这时,寄存器R0R3可以记作A0A3。被调用的子程序在返回前无需恢复寄存器R0R3的内容。 2)在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存器R4R11可以记作V

16、1V8。如果在子程序中使用到了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。 3)寄存器R12用于子程序中间临时寄存器,记作IP。在子程序间的连接代码段中常有这种使用规则。,36,4)寄存器R13用作数据栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器R13在进入子程序时的值和退出子程序时的值必须相等。 5)寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。 6)寄存器R15是程序计数器,记作PC。它不能用作其他用途。,37,参数传递规则:,2)子程序中结果返回的规则如下: 结果为一个32位的整数时,可

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号