ARM及Thumb指令集.ppt_第1页
ARM及Thumb指令集.ppt_第2页
ARM及Thumb指令集.ppt_第3页
ARM及Thumb指令集.ppt_第4页
ARM及Thumb指令集.ppt_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

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

文档简介

1 tmt h e a r c h i t e c t u r e f o r t h e d i g i t a l w o r l d arm及thumb指令集 2 tm234v11 arm及thumb指令集 arm指令小节目录 1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.arm分支指令 7.杂项指令 8.伪指令 3 tm334v11 arm及thumb指令集 arm指令长度概述 narm指令长度 n指令集可以是以下任一种 n32 bits 长 (arm状态) n16 bits 长 (thumb 状态) narm7tdmi 支持3种数据类型 n字节 (8-bit) n半字 (16-bit) n字 (32-bit) n字必须被排成4个字节边界对齐,半字必须被排 列成2个字节边界对齐 4 tm434v11 arm及thumb指令集 arm指令长度概述 n向后兼容:新版本增加指令,并保持指令向 后兼容; nload-store 结构* uload/store 从存储器中读某个值,操 作完后再将其放回存储器中 u只对存放在寄存器的数据进行处理 u对于存储器中的数据,只能使用 load/store指令进行存取 5 tm534v11 arm及thumb指令集 n简单的arm程序 ;文件名:test1.s ;功能:实现两个寄存器相加 ;说明:使用armulate软件仿真调试 areaexample1,code,readonly ;声明代码段example1 entry ;标识程序入口 code32 ;声明32位arm指令 start movr0,#0 ;设置参数 movr1,#10 loopbladd_sub ;调用子程序add_sub bloop ;跳转到loop add_sub addsr0,r0,r1 ;r0 = r0 + r1 movpc,lr ;子程序返回 end ;文件结束 使用“;”进行注释 标号顶格写 实际代码段 声明文件结束 6 tm634v11 arm及thumb指令集 4.2 指令集介绍 n arm指令集指令格式 7 tm734v11 arm及thumb指令集 arm是三地址指令格式,指令的基本格式如下: 4.2 指令集介绍 narm指令集基本指令格式 s , 其中y#1-32 or rs asr算术右移x asr y(signed)xy#1-32 or rs ror算术左移x ror y(unsigned)xy|(x1)none 4.2 指令集介绍 14 tm1434v11 arm及thumb指令集 4.2 指令集介绍 narm指令集第2个操作数 lsl移位操作: 0 lsr移位操作: 0 asr移位操作: ror移位操作: rrx移位操作: c 15 tm1534v11 arm及thumb指令集 4.2 指令集介绍 narm指令集第2个操作数 rm,shift寄存器移位方式 例如: addr1,r1,r1,lsl #3;r1=r1+r1r3 16 tm1634v11 arm及thumb指令集 arm指令目录 1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.arm分支指令 7.杂项指令 8.伪指令 17 tm1734v11 arm及thumb指令集 arm指令的基本格式如下: 4.2 指令集介绍 narm指令集条件码 s , 使用条件码“cond”可以实现高效的逻辑操作(节 省跳转和条件语句),提高代码效率。 所有的arm指令都可以条件执行,而thumb指令 只有b(跳转)指令具有条件执行 功能。如果指令不标 明条件代码,将默认为无条件(al)执行。 18 tm1834v11 arm及thumb指令集 操作码条件助记符标志含义 0000eqz=1相等 0001nez=0不相等 0010cs/hsc=1无符号数大于或等于 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任何从不执行(不要使用) 指令条件码表 19 tm1934v11 arm及thumb指令集 4.2 指令集介绍 narm指令集条件码 c代码: if(a b) a+; else b+; 对应的汇编代码: cmpr0,r1 ;r0(a)与r1(b)比较 addhi r0,r0,#1 ;若r0r1,则r0=r0+1 addls r1,r1,#1 ;若r01,则r1=r1+1 示例: 20 tm2034v11 arm及thumb指令集 narm指令可以通过添加适当的条件码前缀来达到条件执行的目的。 n这样可以提高代码密度,减少分支跳转指令数目,提高性能。 cmp r3,#0 cmp r3,#0 beq skip addne r0,r1,r2 add r0,r1,r2 skip n默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“s”来影 响标志位。 cmp不需要增加 “s”就可改变相应的标志位。 loop subs r1,r1,#1 bne loop 条件执行及标志位 如果 z标志清零则跳转 r1减1,并设置标志位 21 tm2134v11 arm及thumb指令集 条件码 不等于(not equal) 无符号的大于或等于 无符号的小于 负数(minus) 等于(equal) 溢出(overflow) 没溢出 无符号的大于 无符号的小于或大于 正数或零 小于(less than) 大于(greater than) 小于等于 总是执行(always) 大于等于 eq ne cs/hs cc/lo pl vs hi ls ge lt gt le al mi vc suffix描述 z=0 c=1 c=0 z=1 测试的标志位 n=1 n=0 v=1 v=0 c=1 cmp r0,#0 moveq r0,#1 bleq func n置标志位,再使用不同的条件码 if (a=0) x=0; if (a0) x=1; cmp r0,#0 moveq r1,#0 movgt r1,#1 n使用条件比较指令 if (a=4 | a=10) x=0; cmp r0,#4 cmpne r0,#10 moveq r1,#0 24 tm2434v11 arm及thumb指令集 4.2 指令集介绍 narm指令集存储器访问指令 arm处理器是典型的risc处理器,对存储器的 访问只能使用加载和存储指令实现。arm7处理器 是冯诺依曼存储结构,ram存储空间及i/o映射空 间统一编址,除对ram操作以外,对外围io、程序 数据的访问均要通过加载/存储指令进行。 存储器访问指令分为单寄存器操作指令和多寄 存器操作指令。 25 tm2534v11 arm及thumb指令集 助记符说明操作条件码位置 ldr rd,addressing 加载字数据rdaddressing,addressing索引ldrcond ldrb rd,addressing 加载无符号字节数据rdaddressing,addressing索引ldrcondb ldrt rd,addressing以用户模式加载字数据rdaddressing,addressing索引ldrcondt ldrbt rd, addressing 以用户模式加载无符号字节数据rdaddressing,addressing索引ldrcondbt ldrh rd, addressing 加载无符号半字数据rdaddressing,addressing索引ldrcondh ldrsb rd, addressing 加载有符号字节数据rdaddressing,addressing索引ldrcondsb ldrsh rd, addressing加载有符号半字数据 rdaddressing,addressing索引 ldrcondsh arm存储器访问指令单寄存器加载 26 tm2634v11 arm及thumb指令集 助记符说明操作条件码位置 str rd, addressing 存储字数据addressingrd, addressing索引 strcond strb rd,addressing 存储字节数据addressingrd, addressing索引 strcondb strt rd,addressing 以用户模式存储字数据addressingrd, addressing索引 strcondt strbt rd,addressing 以用户模式存储字节数据addressingrd, addressing索引 strcondbt strh rd,addressing 存储半字数据addressing rd, addressing索引 strcondh arm存储器访问指令单寄存器存储 ldr/str指令用于对内存变量的访问、内存缓冲区数据的访问、查表 、外围部件的控制操作等。若使用ldr指令加载数据到pc寄存器,则实现 程序跳转功能,这样也就实现了程序散转。 所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令” 和“半字和有符号字节加载存储指令。 27 tm2734v11 arm及thumb指令集 ldr和str字和无符号字节加载/存储指令 ldr指令用于从内存中读取单一字或字节数据 存入寄存器中,str指令用于将寄存器中的单一字 或字节数据保存到内存。指令格式如下: arm存储器访问指令单寄存器存储 ldrcondtrd, ;将指定地址上的字数据读入rd strcondtrd, ;将rd中的字数据存入指定地址 ldrcondbtrd, ;将指定地址上的字节数据读入rd strcondbtrd, ;将rd中的字节数据存入指定地址 其中,t为可选后缀。若指令有t,那么即使处 理器是在特权模式下,存储系统也将访问看成是在 用户模式下进行的。t在用户模式下无效,不能与 前索引偏移一起使用t。 28 tm2834v11 arm及thumb指令集 arm存储器访问指令单寄存器存储 ldr和str字和无符号字节加载/存储指令编码 指令执行的条件码 i为0时,偏移量为12 位立即数,为1时, 偏移量为寄存器移 位 p表示前/后变址 u表示加/减 b为1表示字节访问 ,为0表示字访问 w表示回写 为指令的寻址方式 rd为源/目标寄存器 rn为基址寄存器 l用于区别加载(l为1) 或存储(l为0) 29 tm2934v11 arm及thumb指令集 arm存储器访问指令单寄存器存储 ldr和str字和无符号字节加载/存储指令 ldr/str指令寻址非常灵活,它由两部分组成,其中一 部分为一个基址寄存器,可以为任一个通用寄存器;另一部 分为一个地址偏移量。地址偏移量有以下3种格式: 立即数。立即数可以是一个无符号的数值。这个数据可以加 到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,#0x12 ;r1 ;将指定地址上的有符号字节读入rd ldrcondsh rd, ;将指定地址上的有符号半字读入rd ldrcondh rd, ;将指定地址上的半字数据读入rd strcondh rd, ;将rd中的半字数据存入指定地址 注意: 1.有符号位半字/字节加载是指用符号位加载扩展到32位,无 符号半字加载是指用零扩展到32位; 2.半字读写的指定地址必须为偶数,否则将产生不可靠的结果 ; 33 tm3334v11 arm及thumb指令集 arm存储器访问指令单寄存器存储 ldr和str半字和有符号字节加载/存储指令编码 指令执行的条件码 i为0时,偏移量为12 位立即数,为1时, 偏移量为寄存器移 位 p表示前/后变址 u表示加/减 w表示回写 为指令的寻址方式 rd为源/目标寄存器 rn为基址寄存器 l用于区别加载(l为1) 或存储(l为0) s为1表示有符号访问, 为0表示无符号访问 h为1表示半字访问,为 0表示字节访问 34 tm3434v11 arm及thumb指令集 ldr和str指令应用示例: 1.加载/存储字和无符号字节指令 ldrr2,r5;将r5指向地址的字数据存入r2 strr1,r0,#0x04;将r1的数据存储到r0+0x04地址 ldrbr3,r2,#-1 ;将r2指向地址的字节数据存入r3,r2r21 strbr0,r3,-r8 asr 2 ;r0-r3-r8/4,存储r0的最低有效字节 2.加载/存储半字和有符号字节指令 ldrsb r1,r0,r3;将r0+r3地址上的字节数据存入r1, ;高24位用符号扩展 ldrh r6,r2,#2;将r2指向地址的半字数据存入r6,高16位用0扩展 ;读出后,r2=r2+2 strh r1,r0,#2!;将r1的半字数据保存到r0+2地址, ;只修改低2字节数据,然后r0=r0+2 arm存储器访问指令单寄存器存储 35 tm3534v11 arm及thumb指令集 练习 str r1, r2,r5! n ldr r5,r3,#-0x03 nstreq r4 r0,r4,lsl r5 nstreq r4 r6,#-0x08 nldr r0,r2!,-r6 nldrne r4,r5,r3,r6 nldr r4 ,start nldr r1, r0! nldr sp,#-0x04 nstr r1,start ;(必须保证start处可以存贮数据) nldr pc,r5 nldr pc , r5 36 tm3634v11 arm及thumb指令集 半字和字节命令 nstrb r5,sp,r3 nldrb r0,r2,-r5,lsl,#0x02 nldrb pc, r5 nstrb r0,r15,#-0x02! nldrhne r3,r5,r8 nldrh r6,r15,#-0x20! nstrh r0,r4,r2,lsl0x02 nstrh r0,pc,#0x08 37 tm3734v11 arm及thumb指令集 有符号半字和有符号字节命令 nldrsh r5, r3-r6 nldrsb r0, r4,#0x0ff nlsrsh r15, r0-r6 nlsrsb r5,r4,0x101 nldrnesh r6,sp,#0x06! nstrsh r6,r6 38 tm3834v11 arm及thumb指令集 t后缀指令 nldrt r5,r6,r7 nldrbt r3,r7,r0 nstrbt r0,r2,lsl#0x01 nstrt r7,r3,#0x02! nldrt r5,r7,r3,lsl#0x040 nsdrt r5,r6,lsl#0x03 nldrt r6,start 39 tm3934v11 arm及thumb指令集 目标寄存器器和基址寄存器是同一寄存器 nldr r4,r4,r3,lsl#2 nldr r4,r4,r3,lsl#2! nldr r4,r4,r3,lsl#2 nldr r4,r3,r4,lsl#2! nstr r4,r4,r3,lsl#2! nstr r4,r4,r3,lsl#2 40 tm4034v11 arm及thumb指令集 使用r15时的数据传送 nldr r15,r5 nldr r6,r15 nldr r7,r15,r7! nstr r15,r7,r1 nstr r0,r15 nstr r0,r15,r8 nstr r0,r15,#0x4! 41 tm4134v11 arm及thumb指令集 助记符说明操作条件码位置 ldmmode rn!,reglist 多寄存器加载reglistrn.,rn回写等ldmcond mode stmmode rn!,reglist 多寄存器存储rn.reglist,rn回写等stmcond mode arm存储器访问指令多寄存器存取 多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元 之间传输数据。ldm为加载多个寄存器;stm为存储多个寄存器。允许一 条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护 、数据复制、常数传递等。 42 tm4234v11 arm及thumb指令集 arm存储器访问指令多寄存器存取 多寄存器加载/存储指令格式如下: ldmcond rn!,reglist stmcond rn!,reglist cond:指令执行的条件; 模式:控制地址的增长方式,一共有8种模式; !:表示在操作结束后,将最后的地址写回rn中; reglist :表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如 r1,r2,r6-r9,寄存器由小到大排列; :可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能: 1)若op是ldm且寄存器列表包含r15时,那么除了正常的多寄存器传送外 ,还将spsr也复制到cpsr中。这用于异常处理返回,仅在异常模式下使用 。 2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。 43 tm4334v11 arm及thumb指令集 arm存储器访问指令多寄存器存取 ldm和stm多寄存器加载/存储指令编码 指令执行的条件码 s对应于指令中的 ”符号 p表示前/后变址 u表示加/减 w表示回写 寄存器列表 rn为基址寄存器 l用于区别加载(l为1) 或存储(l为0) 44 tm4434v11 arm及thumb指令集 arm存储器访问指令多寄存器存取 多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈 操作、左边四种为数据传送操作。 模式说明模式说明 ia每次传送后地址加4fd满递减堆栈 ib每次传送前地址加4ed空递减堆栈 da每次传送后地址减4fa满递增堆栈 db每次传送前地址减4ea空递增堆栈 数据块传送操作堆栈操作 进行数据复制时,先设置好源数据指针和目标指针,然后使用块 拷贝寻址指令ldmia/stmia、ldmib/stmib、ldmda/stmda、 ldmdb/stmdb进行读取和存储 。 进行堆栈操作操作时,要先设置堆栈指针(sp),然后使用堆栈 寻址指令stmfd/ldmfd 、stmed/ldmed、stmfa/ldmfa和 stmea/ldmea实现堆栈操作。 45 tm4534v11 arm及thumb指令集 arm存储器访问指令多寄存器存取 数据块传送指令操作 过程如右图所示,其 中r1为指令执行前的 基址寄存器,r1则 为指令执行后的基址 寄存器。 r5 r6 r7 r1 r1 指令stmia r1!,r5-r7 4008h 4004h 4000h 4014h 4010h 400ch r5 r6 r7r1 r1 指令stmda r1!,r5- r7 4008h 4004h 4000h 4014h 4010h 400ch r5 r6 r7 r1 r1 指令stmib r1!,r5-r7 4008h 4004h 4000h 4014h 4010h 400ch r5 r6 r7 r1 r1 指令stmdb r1!,r5- r7 4008h 4004h 4000h 4014h 4010h 400ch 46 tm4634v11 arm及thumb指令集 arm存储器访问指令多寄存器存取 数据块传送 存储 堆栈操作 压栈 说明 数据块传送 加载 堆栈操作 出栈 说明 stmdastmed空递减ldmdaldmfa满递减 stmiastmea空递增ldmialdmfd满递增 stmdbstmfd满递减ldmdbldmea空递减 stmibstmfa满递增ldmibldmed空递增 ;使用数据块传送指令进行堆栈操作 stmdar0!,r5-r6 . . . ldmibr0!,r5-r6 ;使用堆栈指令进行堆栈操作 stmedr13!,r5-r6 . . . ldmedr13!,r5-r6 两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈 操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈 和出栈操作则需要考虑空与满、加与减对应的问题。 堆栈操作(详见“4.1 寻址方式堆栈寻址”)和数据块传送指令 类似,也有4种模式,它们之间的关系如下表所示: 47 tm4734v11 arm及thumb指令集 堆栈是一个按特定顺序进行存取的存储区,操 作顺序为“后进先出” 。堆栈寻址是隐含的,它使 用一个专门的寄存器(堆栈指针)指向一块存储区域( 堆栈),指针所指向的存储单元即是堆栈的栈顶。存 储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 4.1 arm处理器寻址方式 n寻址方式分类堆栈寻址 48 tm4834v11 arm及thumb指令集 4.1 arm处理器寻址方式 n寻址方式分类堆栈寻址 栈底 栈顶 栈区 sp 堆栈存 储区 栈顶 栈底 栈区 sp 向下 增长 向上 增长 0x12345678 0x12345678 堆栈压栈 堆栈压栈 49 tm4934v11 arm及thumb指令集 栈顶sp 栈顶sp 栈底 空堆栈 栈底 满堆栈 堆栈指针指向最后压入的堆栈的有效数据项, 称为满堆栈;堆栈指针指向下一个待压入数据的空 位置,称为空堆栈。 4.1 arm处理器寻址方式 n寻址方式分类堆栈寻址 0x12345678 0x12345678栈顶sp0x12345678 栈顶sp 压栈压栈 50 tm5034v11 arm及thumb指令集 所以可以组合出四种类型的堆栈方式: 满递增:堆栈向上增长,堆栈指针指向内含有效 数据项的最高地址。指令如ldmfa、stmfa等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的 第一个空位置。指令如ldmea、stmea等; 满递减:堆栈向下增长,堆栈指针指向内含有效 数据项的最低地址。指令如ldmfd、stmfd等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第 一个空位置。指令如ldmed、stmed等。 4.1 arm处理器寻址方式 n寻址方式分类堆栈寻址 nldmia r4,r0,r1,r2,r3,r5 51 tm5134v11 arm及thumb指令集 数据块传送指令 nstmfd r13! ,r0,r4-r6,r13 nldmid r4,r0,r1,r2,r3,r4,r6 nldmfd sp!, r12,r15 nldmfd sp! ,r12,r15 nstmid r0,r0-r5 nstmia r1,r0-r5 52 tm5234v11 arm及thumb指令集 助记符说明操作条件码位置 swp rd,rm,rn 寄存器和存储器字数据交换rdrn,rnrm (rnrd或rm)swpcond swpb rd,rm,rn 寄存器和存储器字节数据交换rdrn,rnrm (rnrd或rm)swpcondb arm存储器访问指令寄存器和存储器交换指令 swp指令用于将一个内存单元(该单元地址放在寄存器rn中)的内容读 取到一个寄存器rd中,同时将另一个寄存器rm的内容写入到该内存单元 中。使用swp可实现信号量操作。 指令格式如下: swpcondb rd,rm,rn 其中,b为可选后缀,若有b,则交换字节,否则交换32位字;rd用于 保存从存储器中读入的数据;rm的数据用于存储到存储器中,若rm与rd 相同,则为寄存器与存储器内容进行互换;rn为要进行数据交换的存储器 地址,rn不能与rd和rm相同。 53 tm5334v11 arm及thumb指令集 arm存储器访问指令寄存器和存储器交换指令 swp和swpb寄存器和存储器交换指令编码 指令执行的条件码 b用于区别无符号字 节(b为1)或字(b 为0) rm源寄存器 rd目标寄存器 rn为基址寄存器 swp指令应用示例: swpr1,r1,r0;将r1的内容与r0指向的存储单元的内容进行互换 swpbr1,r2,r0;将r0指向的存储单元低字节数据读取到r1中 ;(高24位清零),并将r2的内容写入到该内存单元中 ;(最低字节有效) 54 tm5434v11 arm及thumb指令集 复习 55 tm5534v11 arm及thumb指令集 单寄存器数据传送 ldr strword ldrbstrbbyte ldrhstrhhalfword ldrsb带符号的byte load ldrsh带符号的halfword load n存储器系统必须支持所有访问宽度 n语法: n ldr rd, nstr rd, e.g. ldreqb 56 tm5634v11 arm及thumb指令集 地址访问 nldr/str访问的地址由基址寄存器加上偏移量来产生。 n针对word和无符号byte 的访问, 偏移量可以是: n一个无符号12-bit立即数 (如 0 - 4095 bytes). ldr r0,r1,#8 n一个寄存器,或再加上移位(由立即数指定) ldr r0,r1,r2 ldr r0,r1,r2,lsl#2 n可以是从基址寄存器上加或减去偏移量: ldr r0,r1,#-8 ldr r0,r1,-r2 ldr r0,r1,-r2,lsl#2 n对于halfword和带符号的halfword / byte, 偏移量可以是: n一个无符号8 bit 立即数 (如 0-255 bytes). n一个寄存器 (不能偏移)。 n可选择采用pre-indexed或post-indexed方式寻址 57 tm5734v11 arm及thumb指令集 0x5 0x5 r1 0x200 基址 寄存器 0x200 r0 0x5 源寄存器 for str 偏移量 120x20c r1 0x200 原基址 寄存器 0x200 r0 0x5 源寄存器 for str 偏移量 120x20c r1 0x20c 更新 基址寄存器 通过 str r0,r1,#12!来自动更新基址寄存器 pre or post indexed 寻址? n pre-indexed: str r0,r1,#12 n post-indexed: str r0,r1,#12 58 tm5834v11 arm及thumb指令集 nldm / stm指令允许一次传送1到16个寄存器到/从存储器中。 n寄存器传送顺序不能被指定 最小数字的寄存器总是被传送到/从存储器的最低地址上。 ldmiar10,r0,r1,r4 n基址寄存器指定存储器访问开始的地址 n块传送指令针对下列情况很有效: 从存储器中搬运一块数据 保存或恢复堆栈中的内容 如果是慢速存储器,会影响中断响应时间 块数据传送 r1 r4 r0r10 地址增加 59 tm5934v11 arm及thumb指令集 ldm / stm 操作 n语法: rb!, n4 种寻址操作: ldmia / stmiaincrement after(先操作,后增加) ldmib / stmibincrement before(先增加,后操作) ldmda / stmdadecrement after (先操作,后递减) ldmdb / stmdbdecrement before (先递减,后操作) ia r1地址 增加 r4 r0 r1 r4 r0 r1 r4 r0r1 r4 r0 r10 ibdadb ldmxx r10, r0,r1,r4 stmxx r10, r0,r1,r4 基址寄存器 (rb) 60 tm6034v11 arm及thumb指令集 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 存储器顶 sp sp 100 ff 1234 a0be 8034 sp old sp 100 ff 1234 a0be 8034 narm堆栈操作通过块传送指令来完成: stmfd(push)块存储- full descending stack stmdb ldmfd(pop)块装载- full descending stack ldmia stmfd sp!,r4-r7,lr 61 tm6134v11 arm及thumb指令集 n在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成 一个字节或字的交换。 n语法: n swpb rd, rm, rn rm rd 3 2 1 temp 存储器 rn swp 62 tm6234v11 arm及thumb指令集 4.2 指令集介绍 narm指令集分支指令 在arm中有两种方式可以实现程序的跳转,一 种是使用分支指令直接跳转,另一种则是直接向pc 寄存器赋值实现跳转。 分支指令有以下三种: 分支指令b; 带链接的分支指令bl; 带状态切换的分支指令bx。 63 tm6334v11 arm及thumb指令集 arm分支指令指令编码 分支指令b/bl指令编码格式 指令执行的条件码l区别b指令(l为0) 和bl指令(l为1) 24位有符号立即数( 偏移量) 分支指令bx指令编码格式 指令执行的条件码rm目标地址寄存器, 该寄存器装载跳转地址 64 tm6434v11 arm及thumb指令集 助记符说明操作条件码位置 b label分支指令pclabelbcond bl label带链接的分支指令lrpc-4,pclabelblcond bx rm带状态切换的分支指令pcrm,切换处理器状态bxcond arm指令分支指令 65 tm6534v11 arm及thumb指令集 助记符说明操作条件码位置 b label分支指令pclabelbcond bl label带链接的分支指令lrpc-4,pclabelblcond bx rm带状态切换的分支指令pcrm,切换处理器状态bxcond arm指令分支指令 分支指令b指令,该指令跳转范围限制在当前指令的32m字节 地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下: bcond label 应用示例: b waita; 跳转到waita标号处 b0x1234; 跳转到绝对地址0x1234处 66 tm6634v11 arm及thumb指令集 bl label xxx xxx label xxx mov pc,lr addr1 addr2 xxx xxx lr pc 助记符说明操作条件码位置 b label分支指令pclabelbcond bl label带链接的分支指令lrpc-4,pclabelblcond bx rm带状态切换的分支指令pcrm,切换处理器状态bxcond arm指令分支指令 带链接的分支指令bl指令适用于子程序调用,使用该指令后,下 一条指令的地址被拷贝到r14(即lr) 连接寄存器中,然后跳转到指定地址运 行程序。跳转范围限制在当前指令的32m字节地址内。指令格式如下: blcond label addr1label addr2 addr2 1.当程序执行到bl跳转指 令时,硬件将下一条指 令的地址addr2装入lr 寄存器,并把跳转地址 装入程序计数器(pc) 2. 程序跳转到目标地址 label继续执行,当子程 序执行结束后,将lr寄 存器内容存入pc,返回 调用函数继续执行 应用示例(调用子程序): bl label 67 tm6734v11 arm及thumb指令集 助记符说明操作条件码位置 b label分支指令pclabelbcond bl label带链接的分支指令lrpc-4,pclabelblcond bx rm带状态切换的分支指令pcrm,切换处理器状态bxcond arm指令分支指令 带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm )的最低位来切换处理器状态。其跳转范围限制在当前指令的32m字节 地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下: bxcond rm 跳转地址rm0跳转后 cpsr标志t位处理器状态 00arm 11thumb 68 tm6834v11 arm及thumb指令集 助记符说明操作条件码位置 b label分支指令pclabelbcond bl label带链接的分支指令lrpc-4,pclabelblcond bx rm带状态切换的分支指令pcrm,切换处理器状态bxcond arm指令分支指令 带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm )的最低位来切换处理器状态。其跳转范围限制在当前指令的32m字节 地址内(arm指令为字对齐,最低2位地址固定为0)。 rm的位0不用作地 址的一部分。若rm的位0为1,则指令将cpsr中的标志t置位,且将目标 地址的代码解释为thumb代码;若rm的位0为0,则rm的位1就不能为1 。指令格式如下: bxcond rm 应用示例: adrl r0,thumbfun+1 ;将thumb程序的入口地址加1存入r0 bx r0 ; 跳转到r0指定的地址, ;并根据r0的最低位来切换处理器状态 69 tm6934v11 arm及thumb指令集 桶型移位器 destinationcf0destinationcf lsl : logical left shift asr: arithmetic right shift (无符号数)乘2除2,并保留符号位 destinationcf.0destinationcf lsr : logical shift rightror: rotate right (无符号数)除2位轮换 destination rrx: rotate right extended 位轮换,从 cf到msb都参与操作 cf 70 tm7034v11 arm及thumb指令集 寄存器, 可选择是否增加移位操作. n移位值可以是: n 5 bit 无符号整数 n放在另一个寄存器的低字节 n用于常数乘法 立即数 n8 bit ,大小范围0-255。 n右移偶数位 n允许直接加载32-bit 常数到寄存器中 。 结果 操作数1 barrel shifter 操作数2 alu 桶型移位器: 第二个操作数 71 tm7134v11 arm及thumb指令集 n没有任何一条arm 指令可包括一个32 bit的立即数 n所有的arm指令都是32 bits固定长度 n数据处理指令格式中,第二个操作数有12位 n4 bit 移位值 (0-15)乘于2,得到一个范围在0-30,步长为 2的移位值。 n记住一条准则: “最后8位一定要移动偶数位”. 07118 immed_8 shifter ror rot x2 quick quiz: 0xe3a004ff mov r0, #? 立即数 (1) 72 tm7234v11 arm及thumb指令集 nexamples: n下列命令中,汇编器把立即数转换为移位操作: n mov r0,#4096; uses 0x40 ror 26 n add r1,r2,#0xff0000; uses 0xff ror 16 n也可使用 mvn来进行位反转: n mov r0, #0xffffffff ; assembles to mvn r0,#0 n立即数不能使用上述方法产生,否则将导致错误。 031 ror #0 range 0-0xff000000 step 0x01000000 ror #8 range 0-0x000000ff step 0x00000001 range 0-0x000003fc step 0x00000004 ror #30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 立即数 (2) 73 tm7334v11 arm及thumb指令集 n为允许装载大常数,汇编器提供了一条伪指令: nldr rd, =const n它可能汇编成下列指令: nmov or mvn。 或 nldr 指令,从数据池(literal pools)读取常数。 nfor example nldr r0,=0xff=mov r0,#0xff nldr r0,=0x55555555=ldr r0,pc,#imm12 dcd 0x55555555 n建议把常数装载到寄存器中时一律使用该伪指令。 装载32 bit常数 74 tm7434v11 arm及thumb指令集 测验 #1 n1. 写一条 arm 指令,分别完成下列操作: a) r0 = 16 b) r0 = r1 / 16(带符号的数字) c) r1 = r2 * 3 d) r0 = -r0 n2. 下面哪些立即数是数据处理指令中有效的数据? a) 0x00ab0000 b) 0x0000ffff c) 0xf000000f d) 0x08000012 e) 0x00001f80 f) 0xffffffff n3. bic指令做什么用? n4. 为什么arm 处理器增加了一条rsb 指令? 75 tm7534v11 arm及thumb指令集 start stopr0 = r1 ? r0 r1 ? r0 = r0 - r1r1 = r1 - r0 yes no yes no 你只需要使用cmp、sub和b指令。 充分使用条件执行! 大家可以尝试计算 2109 和 4161 的gcd area myarea, code entry mov r0, #9 mov r1, #15 start ; your code here stop b stop end 测验 #2 - gcd n新建一个 arm executable image 项目 n新建一个 text文件 n另存为 “gcd.s” n加入到项目中 nbuild 并执行 76 tm7634v11 arm及thumb指令集 乘法 n语法: nmuls rd, rm, rsrd = rm * rs nmlas rd,rm,rs,rnrd = (rm * rs) + rn nu|smulls rdlo, rdhi, rm, rsrdhi,rdlo := rm*rs nu|smlals rdlo, rdhi, rm, rs rdhi,rdlo := (rm*rs)+rdhi,rdlo n占用的周期数 n基本 mul 指令 narm7tdmi 上为2-5 周期 nstrongarm/xscale上为1-3 周期 narm9e/arm102xe上为2 周期 narm9tdmi 比 arm7tdmi多1 周期 n累加再多1 周期 (不针对9e,尽管结果延迟多于1周期) n对于“long”型数据,多1 周期 n以上均为一般规则,确切细节查看相应手册。 77 tm7734v11 arm及thumb指令集 软件中断 (swi) n产生一个异常陷阱,跳转到swi 硬件向量。 nswi 处理程序可以检测swi号,从而决定采取何种操作。 n通过swi机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权 操作。 n语法: n swi 28312427 0 cond 1 1 1 1swi number (ignored by processor) 23 条件域 78 tm7834v11 arm及thumb指令集 psr 传送指令 nmrs和msr允许传送cpsr / spsr中的内容到/从一个通用寄存器中。 n语法: n mrs rd, ; rd = n msr ,rm ; = rm 在这里: n = cpsr or spsr n_fields = fsxc的任意组合 n也允许送一个立即数到 psr_fields n msr ,#immediate n用户模式下,所有位均可以被读取,但只有条件标志位 (_f)可被写。 2731 n z c v q 2867 i f t mode 1623 815 54024 fsxc u n d e f i n e dj 79 tm7934v11 arm及thumb指令集 协处理器指令 narm体系支持16个协处理器 n针对每个协处理器的指令占用 arm指令集中的固定部分 n如果相应的协处理器不存在

温馨提示

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

评论

0/150

提交评论