arm指令体系

上传人:suns****4568 文档编号:118703915 上传时间:2019-12-23 格式:PPT 页数:57 大小:1.89MB
返回 下载 相关 举报
arm指令体系_第1页
第1页 / 共57页
arm指令体系_第2页
第2页 / 共57页
arm指令体系_第3页
第3页 / 共57页
arm指令体系_第4页
第4页 / 共57页
arm指令体系_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《arm指令体系》由会员分享,可在线阅读,更多相关《arm指令体系(57页珍藏版)》请在金锄头文库上搜索。

1、1ESEC ARM指令体系 2 034v14ESEC 为什么需要了解汇编指令集 对于很多系统来说,设计上的绝大部分努力将关注的焦点集中在被编译的代码上, 而指令集的知识是不必要的 但是. 嵌入式系统需要初始化代码和中断例程 所有的系统都需要调试 很有可能是在汇编指令这一级的 通过编写汇编的处理例程可使系统的性能提高 ARM体系的有些特性对编译器是无效的 3 034v14ESEC 主要内容 1 v4T 架构 2 v5TE 架构 3 v6 架构 4 Thumb 4 034v14ESEC 通过在指令后加上合适的条件标志码,ARM指令可以条件执行 通过减少前向的分支数目,增强了指令的代码密度和指令性能

2、 CMP r0, r1 ADDGT r2, r2, #1 ADDLE r3, r3, #1 默认情况下,数据处理指令不会影响条件标志位,但是,可在指令后加“s”(或其它 条件位)后缀,以实现标志位的置位。 loop ADD r2, r2, r3 SUBS r1, r1, #0 x01 BNE loop r2=r2+r3 if Z flag clear then branch decrement r1 and set flags r0 - r1, compare r0 with r1 and set flags if r2=r2+1 flags remain unchanged if = r3=

3、r3+1 flags remain unchanged 1.1 条件执行和标志位 5 034v14ESEC 1.1.1 条件执行的例子 if (r0 = 0) r1 = r1 + 1; else r2 = r2 + 1; C 代码 5 条指令 占据 5 个字 5个或者6个时钟周期 3 条指令 占据3 个字 3 个时钟周期 CMP r0, #0 BNE else ADD r1, r1, #1 B end else ADD r2, r2, #1 end . ARM 指令 非条件执行 CMP r0, #0 ADDEQ r1, r1, #1 ADDNE r2, r2, #1 . 条件执行 6 034v

4、14ESEC 1.1.2 指令条件码 Not equal Unsigned higher or same Unsigned lower Minus Equal Overflow No overflow Unsigned higher Unsigned lower or same Positive or Zero Less than Greater than Less than or equal Always Greater or equal EQ NE CS/HS CC/LO PL VS HI LS GE LT GT LE AL MI VC SuffixDescription Z=0 C=1

5、C=0 Z=1 Flags tested N=1 N=0 V=1 V=0 C=1 r0 = r1 * r2 MLA r0, r1, r2, r3; r0 = (r1 * r2) + r3 64位的乘法提供了两种乘法指令:无符号和有符号乘 对于这类指令他们有两个目标寄存器 U|SMULL r4, r5, r2, r3; r5:r4 = r2 * r3 U|SMLAL r4, r5, r2, r3; r5:r4 = (r2 * r3) + r5:r4 大多数的 ARM 核不提供整数除法指令 除法操作由c的库函数例程或者移位操作实现 1.3 乘法和除法 15 034v14ESEC 1.4 分支指令

6、分支跳转指令有如下的格式: BL label 子函数调用可加上 L实现 在指令编码中,存在一个 24 位的地址域 在执行时它被左移两位 (因为 ARM 指令是字对齐的),产生一个26位的偏移地址,由 此可知跳转的范围大体在-32MB+32MB之间 B start . . start PC 相对寻址的标号 “start” 跳转到此处继续执行 16 034v14ESEC 17 034v14ESEC 1.4.1 通过LDR指令实现跳转 ARM的分支指令跳转范围局限于 32MB 然而可通过直接将分支的地址加载到PC中实现跳转 为了简单起见,ARM汇编器提供了这样的伪指令 汇编代码 LDR pc, =l

7、abel ; 将标号的地址加载到PC中 ARMASM 目标代码 LDR pc, pc, #n . - DCD 0 x12345678 Literal pool 域中的数据 因此,该伪指令实现了在 4GB 地址空 间的任意跳转 18 034v14ESEC : BL func2 : : BX lr func1func2 void func1 (void) : func2(); : 1.4.2 子程序 实现一个传统的子程序调用需要两个步骤: 保存返回地址 跳转到子程序的首地址 这些步骤可以由一条指令完成, BL 返回地址被保存在链接寄存器 (lr/r14) 分支跳转到 +/- 32MB 范围内的任何

8、地址 重新加载链接寄存器的内容至PC寄存器即可实现返回 19 034v14ESEC 思考题 用一条ARM指令分别实现下面的语句: a) r0 = 16 b) r0 = r1 / 16(signed numbers) c) r1 = r2 * 3 d) r0 = -r0 20 034v14ESEC 1.4.3 源代码文件实例 AREA ARMEX, CODE, READONLY ENTRY ARM main MOV r0, #10 MOV r1, #3 ADD r2, r0, r1 ; this is a comment stop B stop END 定义一个名为“ARMEX”的只读代码段 标

9、识源文件的末尾 标识程序的入口点 一系列ARM指令的开始 标号必须顶格书写 21 034v14ESEC 1.5 单寄存器的数据传输 LDRSTR字 LDRBSTRB字节 LDRHSTRH半字 LDRSB有符号的字节加载 LDRSH有符号的半字加载 语法: LDR Rd, STR Rd, 举例 LDREQB 22 034v14ESEC 1.5.1 地址寻址方式 被LDR/STR指令访问的地址通过一个基址寄存器和一个偏移量来指定 对于字和无符号的字节访问, 偏移量可以为: 一个无符号的12位立即数 (i.e. 0 - 4095 bytes) LDR r0, r1, #8 寄存器, 可附加的对其进行

10、移位 LDR r0, r1, r2 LDR r0, r1, r2, LSL#2 对于半字和有符号的字节访问, 偏移量可以为: 一个8位的立即数 (i.e. 0 - 255 bytes) 一个寄存器 (不可以被移位) 基址寄存器的地址可加也可减: LDR r0, r1, #-8 LDR r0, r1, -r2, LSL#2 是前序还是后序寻址 是否更新基址寄存器 (仅限于前序寻址) LDR r0, r1, #-8! 23 034v14ESEC 0 x5 0 x5 r1 0 x200 基址寄存 器 0 x200 r0 0 x5 源寄存 器 偏移量 120 x20c r1 0 x200 初始的基 址

11、寄存器 0 x200 r0 0 x5 源寄存 器 偏移量 120 x20c r1 0 x20c 更新后的基 址寄存器 更新基址寄存器形式: STR r0,r1,#12! 1.5.2 前序或者后序寻址? 前序寻址: STR r0, r1, #12 后序寻址: STR r0, r1, #12 24 034v14ESEC 1.5.3 通过LDR指令实现跳转 ARM的分支指令跳转范围局限于 32MB 然而可通过直接将分支的地址加载到PC中实现跳转 为了简单起见,ARM汇编器提供了这样的伪指令 Assembler Code LDR pc, =label ; 将标号的地址加载到PC中 ARMASM Obj

12、ect Code LDR pc, pc, #n . - DCD 0 x12345678 Literal pool 域中的数据 因此,该伪指令实现了在 4GB 地址空 间的任意跳转 25 034v14ESEC 基址寄存器的更新使编写简单的块拷贝例程成为可能 举例: 后序寻址可用来拷贝一个内存块 ; r8 源数据块的起始指针 ; r9 源数据块的结束指针 ; r10 目的数据块的起始指针 loopLDRr0, r8, #4; 加载4个字节 STRr0, r10, #4 ; 存储至目标地址 CMPr8, r9; 检查是否完毕 BLTloop; 循环 在这个例子中每次循环拷贝一个字 1.5.4 基于L

13、DR/STR的内存块拷贝 Increasing Memory r9 r8 r10 26 034v14ESEC 1.6 批量加载/存储Load and Store Multiples 语法: Rb!, 4 种地址模式: LDMIA / STMIA increment after LDMIB / STMIB increment before LDMDA / STMDA decrement after LDMDB / STMDB decrement before IA r1地址增长 方向 r4 r0 r1 r4 r0 r1 r4 r0r1 r4 r0 r10 IBDADB LDMxx r10, r0

14、,r1,r4 STMxx r10, r0,r1,r4 基址寄存器 (Rb) 27 034v14ESEC STM / LDM不仅可用于堆栈操作,它们也可以用来进行内存块拷贝 举例 ; r8 源数据块的起始指针 ; r9 源数据块的结束指针 ; r10 目的数据块的起始指针 loopLDMIAr8!, r0-r7; 加载 32 个字节 STMIAr10!, r0-r7 ; 存储至目标地址 CMPr8, r9; 检查拷贝是否完毕 BLTloop; 循环 在这个例子中每次循环拷贝8个字 1.6.1 基于LDM/STM的内存块拷贝 Increasing Memory r9 r8 r10 28 034v1

15、4ESEC 1.6.2 堆栈 LDMFD sp!, r4-r7, pc SP100 FF 1234 AOBE 8034 1010 1234 8420 9753 r41 r5 14544 r60 r712 lr9048 pc9020 r4100100 FFr5FF 1234r61234 A0BEr7A0BE 8034 pc8034 r4100 r5FF r61234 r7A0BE lr8034 ABCD 8765 102E 16 FFFF 1010 1234 8420 9753 Top of Memory SP SP 100 FF 1234 A0BE 8034 SP Old SP 100 FF 1234 A0BE 8034 ARM 堆栈操作由块数据传输指令: STMFD(Push) 批存储 满递减堆栈 STMDB LDMFD(Pop)批加载 满递减堆栈 LDMIA 注意: 寄存器在压栈时的顺序始终是最低编号寄存器的内容压入最低地址的堆栈空 间 被指定的寄

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

当前位置:首页 > 大杂烩/其它

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