第4章ARM处理器指令概述.ppt
《第4章ARM处理器指令概述.ppt》由会员分享,可在线阅读,更多相关《第4章ARM处理器指令概述.ppt(45页珍藏版)》请在三一文库上搜索。
1、第4章ARM处理器指令概述,本章重点,常用ARM指令 ARM汇编程序编程实例 汇编与C语言混合编程 ADS集成开发环境,本章内容,4.1 ARM 微处理器的指令的分类与格式 4.2 ARM 指令的寻址方式 4.3 常用ARM指令 4.4 汇编语言的程序结构及在ADS环境下调试 4.5 汇编语言与 C/C+的混合编程,4.1 ARM 微处理器的指令的分类与格式,ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PS
2、R)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。,4.2 ARM 指令的寻址方式,所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。 4.2.1 立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下 指令: ADD R0,R0,1 ;R0R01 ADD R0,R0,0x3f ;R0R00x3f 在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在
3、“”后加上“0x”或“&”。,4.2 ARM 指令的寻址方式,4.2.2 寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令: ADD R0,R1,R2 ;R0R1R2 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。 4.2.3 寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: ADD R0,R1,R2 ;R0R1R2 LDR R0,R1 ;R0R1 STR R0,R1 ;R1R0 在第一条指令中,以寄存器 R2 的
4、值作为操作数的地址,在存储器中取得一个操作数后与 R1 相加,结果存入寄存器 R0 中。 第二条指令将以 R1 的值为地址的存储器中的数据传送到 R0 中。 第三条指令将 R0 的值传送到以 R1 的值为地址的存储器中。,4.2 ARM 指令的寻址方式,4.2.4 基址变址寻址 基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示: LDR R0,R1,#4 ;R0R14 LDR R0,R1,#4! ;R0R14、R1R14 LDR
5、 R0,R1 ,#4 ;R0R1、R1R14 LDR R0,R1,R2 ;R0R1R2 在第一条指令中,将寄存器 R1 的内容加上 4 形成操作数的有效地址,从而取得操作数存入寄存器 R0 中。 在第二条指令中,将寄存器 R1 的内容加上 4 形成操作数的有效地址,从而取得操作数存入寄存器 R0 中,然后,R1 的内容自增 4 个字节。 在第三条指令中,以寄存器 R1 的内容作为操作数的有效地址,从而取得操作数存入寄存器 R0中,然后,R1 的内容自增 4 个字节。 在第四条指令中,将寄存器 R1 的内容加上寄存器 R2 的内容形成操作数的有效地址,从而取得操作数存入寄存器 R0 中。,4.2
6、 ARM 指令的寻址方式,4.2.5 多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多 16 个通用寄存器的值。以下指令: LDMIA R0,R1,R2,R3,R4 ;R1R0 ;R2R04 ;R3R08 ;R4R012 该指令的后缀 IA 表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1R4。 4.2.6 相对寻址 与基址变址寻址方式相类似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,
7、跳转指令 BL 采用了相对寻址方式: BL NEXT ;跳转到子程序 NEXT 处执行 NEXT MOV PC,LR ;从子程序返回,4.2 ARM 指令的寻址方式,4.2.7 堆栈寻址 堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。 同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈
8、(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式, 即: 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。,4.3 常用ARM指令,4.3.1 内存访问指令 1. 基本指令 LDR:存储器memory中数据传送
9、到寄存器register STR:寄存器register中数据传送到存储器memory 例如: ldr r0, r1 ; r1作为指针,该指针指向的数存入r0 str r0, r1, #4 ; r1+4作为指针,r0的值存入该地址 str r0, r1, #4! ; 同上,并且r1 = r1 + 4 ldr r1, =0x08100000 ; 立即数0x08100000存到r1 ldr r1, r2, #4 ; r2+4作为指针,指向的值存入r1,并且r2=r2+4,4.3 常用ARM指令,4.3.1 内存访问指令 2. 多字节存取指令 多字节存取指令常应用于堆栈操作。 LDM:存储器memo
10、ry中数据传送到多个寄存器 STM:多个寄存器中的数据传送到存储器memory 例如: sub lr, lr, #4 ;lr4是异常处理完后应该返回的地方 stmfd sp!,r0-r12, lr ;保存r0r12和lr寄存器的值到堆栈并更新堆栈指针。 ldmfd sp!,r0-r12, pc ;从堆栈中恢复r0r12,返回地址赋给pc指针,使程序返回到异常发生前所执行的地方,标记用来使CPU退出异常模式,进入普通状态。,4.3 常用ARM指令,4.3.2 算术运算指令 基本指令: ADD:加 SUB:减 例如: add r0, r1, r2 ; r0 = r1 + r2 adds r0, r
11、1, #0x80 ; r0 = r1 + 0x80,并设置状态寄存器 subs r0, r1,#2000 ; r0 = r1 2000,并设置状态寄存器,4.3 常用ARM指令,4.3.3 逻辑运算指令 基本指令: AND:与 ORR:或 EOR:异或 BIC:位清0 例如: ands r0,r1,#0xff00 ; r0 = r1 and 0xff00,并设置状态寄存器 orr r0, r1, r2 ; r0 = r1 and r2 bics r0, r1, #0xff00 ; r0 = r1 and ! (0xff00) ands r0, r1, #0xffff00ff ; 错误,4.3
12、常用ARM指令,4.3.4 MOV指令 mov指令: 例如: mov r0, #8 ; r0 = 8 mov r0, r1 ; r0 = r1 mov不同于LDR、STR指令,该指令可以在寄存器间赋值。 4.3.5比较指令 基本指令: CMP:比较两个操作数,并设置状态寄存器 例如: cmp r0, r1 ;计算r0- r1,并设置状态寄存器,判断r0是否大于、小于或等于r1 cmp r0, #0 ;,4.3 常用ARM指令,4.3.6 跳转指令 基本指令: B:跳转 BL:跳转并将下一指令的地址存入lr寄存器 例如: loop1 b loop1 ; 跳到地址loop1处 bl sub1 ;
13、将下一指令地址写入lr,并跳至sub1 sub1 mov pc, lr ; 从sub1中返回,4.3 常用ARM指令,4.3.7 条件执行指令 条件:状态寄存器中某一或某几个比特的值代表条件,对应不同的条件后缀cond。 例如: cmp r0, r1 ;比较r0和r1 blgt sub1 ;如果r0r1,跳转到sub1,否则不操作 ; ;一段循环代码 ldr r2, =8 ;r2 = 8 loop ;这里可以进行一些循环内的操作 subs r2, r2, #1 ;r2 = r2 1,并设置状态位 bne loop ;如果r2不等于0,则继续循环 ; mov r0, #1 ; r0 = 1 cm
14、p r2, #8 ;比较r2和8 movlt r0, #2 ;如果r28,r0 = 2,4.4 汇编语言的程序结构及在ADS环境下调试,在 ARM(Thumb)汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。 441 汇编语言程序结构 以下是一个汇编语言源程序的基本结构。 AREA Init,CODE,READONLY ENTRY END ;
15、汇编语言源程序的基本结构,分号为注释 AREA EX2,CODE,READONLY ;AREA指令定义一个名为EX2程序段,属性为只读,4.4 汇编语言的程序结构及在ADS环境下调试,例4-1 定义一个代码段arm,其属性为只读,首先分别给3个变量赋值,给x、y赋两个值,给stack_top赋一个地址,程序代码如下,请阅读程序写出最后r0的值及调试程序及地址0x1000上的内容,程序名为test1.s。 AREA arm,CODE,READONLY x EQU 45 y EQU 64 stack_top EQU 0x1000 ENTRY MOV sp,#stack_top MOV r0,#x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 处理器 指令 概述
链接地址:https://www.31doc.com/p-5030216.html