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

下载本文档

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

文档简介

arm及thumb指令集,arm指令小节目录,1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.arm分支指令 7.杂项指令 8.伪指令,arm指令长度概述,arm指令长度 指令集可以是以下任一种 32 bits 长 (arm状态) 16 bits 长 (thumb 状态) arm7tdmi 支持3种数据类型 字节 (8-bit) 半字 (16-bit) 字 (32-bit) 字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,arm指令长度概述,向后兼容:新版本增加指令,并保持指令向后兼容; load-store 结构* load/store 从存储器中读某个值,操作完后再将其放回存储器中 只对存放在寄存器的数据进行处理 对于存储器中的数据,只能使用load/store指令进行存取,简单的arm程序,;文件名:test1.s ;功能:实现两个寄存器相加 ;说明:使用armulate软件仿真调试 area example1,code,readonly ;声明代码段example1 entry ;标识程序入口 code32 ;声明32位arm指令 start mov r0,#0 ;设置参数 mov r1,#10 loop bl add_sub ;调用子程序add_sub b loop ;跳转到loop add_sub adds r0,r0,r1 ;r0 = r0 + r1 mov pc,lr ;子程序返回 end ;文件结束,使用“;”进行注释,标号顶格写,实际代码段,声明文件结束,4.2 指令集介绍,arm指令集指令格式,arm是三地址指令格式,指令的基本格式如下:,4.2 指令集介绍,arm指令集基本指令格式, s ,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符; cond:执行条件; s:是否影响cpsr寄存器的值; rd:目标寄存器; rn:第1个操作数的寄存器; operand2:第2个操作数;,例:,arm指令的基本格式如下:,4.2 指令集介绍,arm指令集第2个操作数, s ,灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式: #immed_8r常数表达式; rm寄存器方式; rm,shift寄存器移位方式;,4.2 指令集介绍,arm指令集第2个操作数,#immed_8r常数表达式 该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。,循环右移10位,8位常数,4.2 指令集介绍,arm指令集第2个操作数,rm寄存器方式 在寄存器方式下,操作数即为寄存器的数值。 例如: sub r1,r1,r2,4.2 指令集介绍,arm指令集第2个操作数,rm,shift寄存器移位方式 将寄存器的移位结果作为操作数(移位操作不消耗额外的时间),但rm值保持不变,移位方法如下:,桶形移位器,4.2 指令集介绍,桶形移位器操作,4.2 指令集介绍,4.2 指令集介绍,arm指令集第2个操作数,4.2 指令集介绍,arm指令集第2个操作数,rm,shift寄存器移位方式 例如: add r1,r1,r1,lsl #3 ;r1=r1+r1r3,arm指令目录,1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.arm分支指令 7.杂项指令 8.伪指令,arm指令的基本格式如下:,4.2 指令集介绍,arm指令集条件码, s ,使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。 所有的arm指令都可以条件执行,而thumb指令只有b(跳转)指令具有条件执行 功能。如果指令不标明条件代码,将默认为无条件(al)执行。,指令条件码表,4.2 指令集介绍,arm指令集条件码,c代码: if(a b) a+; else b+;,对应的汇编代码: cmp r0,r1 ;r0(a)与r1(b)比较 addhi r0,r0,#1 ;若r0r1,则r0=r0+1 addls r1,r1,#1 ;若r01,则r1=r1+1,示例:,arm指令可以通过添加适当的条件码前缀来达到条件执行的目的。 这样可以提高代码密度,减少分支跳转指令数目,提高性能。 cmp r3,#0 cmp r3,#0 beq skip addne r0,r1,r2 add r0,r1,r2 skip 默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“s”来影响标志位。 cmp不需要增加 “s”就可改变相应的标志位。 loop subs r1,r1,#1 bne loop,条件执行及标志位,条件码,下表为所有可能的条件码: 注意:al为默认状态,不需要单独指出,程序状态寄存器,条件位: n = negative result from alu z = zero result from alu c = alu operation carried out v = alu operation overflowed q 位: 仅arm 5te/j架构支持 指示饱和状态 j 位 仅arm 5te/j架构支持 j = 1: 处理器处于jazelle状态,中断禁止位: i = 1: 禁止 irq. f = 1: 禁止 fiq. t bit 仅arm xt架构支持 t = 0: 处理器处于 arm 状态 t = 1: 处理器处于 thumb 状态 mode位: 处理器模式位,条件执行示例,一系列的指令都使用条件指令 if (a=0) func(1); cmp r0,#0 moveq r0,#1 bleq func 置标志位,再使用不同的条件码 if (a=0) x=0; if (a0) x=1; cmp r0,#0 moveq r1,#0 movgt r1,#1 使用条件比较指令 if (a=4 | a=10) x=0; cmp r0,#4 cmpne r0,#10 moveq r1,#0,4.2 指令集介绍,arm指令集存储器访问指令,arm处理器是典型的risc处理器,对存储器的访问只能使用加载和存储指令实现。arm7处理器是冯诺依曼存储结构,ram存储空间及i/o映射空间统一编址,除对ram操作以外,对外围io、程序数据的访问均要通过加载/存储指令进行。 存储器访问指令分为单寄存器操作指令和多寄存器操作指令。,arm存储器访问指令单寄存器加载,arm存储器访问指令单寄存器存储,ldr/str指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用ldr指令加载数据到pc寄存器,则实现程序跳转功能,这样也就实现了程序散转。 所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令。,ldr和str字和无符号字节加载/存储指令 ldr指令用于从内存中读取单一字或字节数据存入寄存器中,str指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:,arm存储器访问指令单寄存器存储,ldrcondt rd, ;将指定地址上的字数据读入rd strcondt rd, ;将rd中的字数据存入指定地址 ldrcondbt rd, ;将指定地址上的字节数据读入rd strcondbt rd, ;将rd中的字节数据存入指定地址,其中,t为可选后缀。若指令有t,那么即使处理器是在特权模式下,存储系统也将访问看成是在用户模式下进行的。t在用户模式下无效,不能与前索引偏移一起使用t。,arm存储器访问指令单寄存器存储,ldr和str字和无符号字节加载/存储指令编码,指令执行的条件码,i为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位,p表示前/后变址,u表示加/减,b为1表示字节访问,为0表示字访问,w表示回写,为指令的寻址方式,rd为源/目标寄存器,rn为基址寄存器,l用于区别加载(l为1)或存储(l为0),arm存储器访问指令单寄存器存储,ldr和str字和无符号字节加载/存储指令 ldr/str指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式: 立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,#0x12 ;r1-r0+0x12 寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,r2 ; r1-r0+r2 ldr r1,r0,-r2 ; r1-r0-r2 寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,r2,lsl #2 ;r1-r0+r2*4,arm存储器访问指令单寄存器存储,ldr和str字和无符号字节加载/存储指令 ldr/str指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式: 立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,#0x12 ;r1-r0+0x12 寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,r2 ; r1-r0+r2 ldr r1,r0,-r2 ; r1-r0-r2 寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:ldr r1,r0,r2,lsl #2 ;r1-r0+r2*4,arm存储器访问指令单寄存器存储,从寻址方式的地址计算方法分,加载/存储指令有以下4种格式: 零偏移。 如:ldr rd,rn 前索引偏移。 如:ldr rd,rn,#0x04! 程序相对偏移。 如:ldr rd,labe1 后索引偏移。 如:ldr rd,rn,#-0x04 注意:必须保证字数据操作的地址是32位对齐的。,ldr和str字和无符号字节加载/存储指令,ldr和str半字和有符号字节加载/存储指令 这类ldr/str指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符号字节指令相同。,arm存储器访问指令单寄存器存储,ldrcondsb rd, ;将指定地址上的有符号字节读入rd ldrcondsh rd, ;将指定地址上的有符号半字读入rd ldrcondh rd, ;将指定地址上的半字数据读入rd strcondh rd, ;将rd中的半字数据存入指定地址,注意: 1.有符号位半字/字节加载是指用符号位加载扩展到32位,无符号半字加载是指用零扩展到32位; 2.半字读写的指定地址必须为偶数,否则将产生不可靠的结果;,arm存储器访问指令单寄存器存储,ldr和str半字和有符号字节加载/存储指令编码,指令执行的条件码,i为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位,p表示前/后变址,u表示加/减,w表示回写,为指令的寻址方式,rd为源/目标寄存器,rn为基址寄存器,l用于区别加载(l为1)或存储(l为0),s为1表示有符号访问,为0表示无符号访问,h为1表示半字访问,为0表示字节访问,ldr和str指令应用示例: 1.加载/存储字和无符号字节指令 ldr r2,r5 ;将r5指向地址的字数据存入r2 str r1,r0,#0x04 ;将r1的数据存储到r0+0x04地址 ldrb r3,r2,#-1 ;将r2指向地址的字节数据存入r3,r2r21 strb r0,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存储器访问指令单寄存器存储,练习,str r1, r2,r5! ldr r5,r3,#-0x03 streq r4 r0,r4,lsl r5 streq r4 r6,#-0x08 ldr r0,r2!,-r6 ldrne r4,r5,r3,r6 ldr r4 ,start ldr r1, r0! ldr sp,#-0x04 str r1,start ;(必须保证start处可以存贮数据) ldr pc,r5 ldr pc , r5,半字和字节命令,strb r5,sp,r3 ldrb r0,r2,-r5,lsl,#0x02 ldrb pc, r5 strb r0,r15,#-0x02! ldrhne r3,r5,r8 ldrh r6,r15,#-0x20! strh r0,r4,r2,lsl0x02 strh r0,pc,#0x08,有符号半字和有符号字节命令,ldrsh r5, r3-r6 ldrsb r0, r4,#0x0ff lsrsh r15, r0-r6 lsrsb r5,r4,0x101 ldrnesh r6,sp,#0x06! strsh r6,r6,t后缀指令,ldrt r5,r6,r7 ldrbt r3,r7,r0 strbt r0,r2,lsl#0x01 strt r7,r3,#0x02! ldrt r5,r7,r3,lsl#0x040 sdrt r5,r6,lsl#0x03 ldrt r6,start,目标寄存器器和基址寄存器是同一寄存器,ldr r4,r4,r3,lsl#2 ldr r4,r4,r3,lsl#2! ldr r4,r4,r3,lsl#2 ldr r4,r3,r4,lsl#2! str r4,r4,r3,lsl#2! str r4,r4,r3,lsl#2,使用r15时的数据传送,ldr r15,r5 ldr r6,r15 ldr r7,r15,r7! str r15,r7,r1 str r0,r15 str r0,r15,r8 str r0,r15,#0x4!,arm存储器访问指令多寄存器存取,多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。ldm为加载多个寄存器;stm为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。,arm存储器访问指令多寄存器存取,多寄存器加载/存储指令格式如下: ldmcond rn!,reglist stmcond rn!,reglist cond:指令执行的条件; 模式:控制地址的增长方式,一共有8种模式; !:表示在操作结束后,将最后的地址写回rn中; reglist :表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如r1,r2,r6-r9,寄存器由小到大排列; :可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能: 1)若op是ldm且寄存器列表包含r15时,那么除了正常的多寄存器传送外,还将spsr也复制到cpsr中。这用于异常处理返回,仅在异常模式下使用。 2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。,arm存储器访问指令多寄存器存取,ldm和stm多寄存器加载/存储指令编码,指令执行的条件码,s对应于指令中的”符号,p表示前/后变址,u表示加/减,w表示回写,寄存器列表,rn为基址寄存器,l用于区别加载(l为1)或存储(l为0),arm存储器访问指令多寄存器存取,多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。,进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令ldmia/stmia、ldmib/stmib、ldmda/stmda、ldmdb/stmdb进行读取和存储 。 进行堆栈操作操作时,要先设置堆栈指针(sp),然后使用堆栈寻址指令stmfd/ldmfd 、stmed/ldmed、stmfa/ldmfa和stmea/ldmea实现堆栈操作。,arm存储器访问指令多寄存器存取,数据块传送指令操作过程如右图所示,其中r1为指令执行前的基址寄存器,r1则为指令执行后的基址寄存器。,arm存储器访问指令多寄存器存取,;使用数据块传送指令进行堆栈操作 stmda r0!,r5-r6 . . . ldmib r0!,r5-r6,;使用堆栈指令进行堆栈操作 stmed r13!,r5-r6 . . . ldmed r13!,r5-r6,两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈,4.1 arm处理器寻址方式,寻址方式分类堆栈寻址,4.1 arm处理器寻址方式,寻址方式分类堆栈寻址,0x12345678,0x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,4.1 arm处理器寻址方式,寻址方式分类堆栈寻址,0x12345678,所以可以组合出四种类型的堆栈方式: 满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如ldmfa、stmfa等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如ldmea、stmea等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如ldmfd、stmfd等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如ldmed、stmed等。,4.1 arm处理器寻址方式,寻址方式分类堆栈寻址 ldmia r4,r0,r1,r2,r3,r5,数据块传送指令,stmfd r13! ,r0,r4-r6,r13 ldmid r4,r0,r1,r2,r3,r4,r6 ldmfd sp!, r12,r15 ldmfd sp! ,r12,r15 stmid r0,r0-r5 stmia r1,r0-r5,arm存储器访问指令寄存器和存储器交换指令,swp指令用于将一个内存单元(该单元地址放在寄存器rn中)的内容读取到一个寄存器rd中,同时将另一个寄存器rm的内容写入到该内存单元中。使用swp可实现信号量操作。 指令格式如下: swpcondb rd,rm,rn 其中,b为可选后缀,若有b,则交换字节,否则交换32位字;rd用于保存从存储器中读入的数据;rm的数据用于存储到存储器中,若rm与rd相同,则为寄存器与存储器内容进行互换;rn为要进行数据交换的存储器地址,rn不能与rd和rm相同。,arm存储器访问指令寄存器和存储器交换指令,swp和swpb寄存器和存储器交换指令编码,指令执行的条件码,b用于区别无符号字节(b为1)或字(b为0),rm源寄存器,rd目标寄存器,rn为基址寄存器,swp指令应用示例: swp r1,r1,r0 ;将r1的内容与r0指向的存储单元的内容进行互换 swpb r1,r2,r0 ;将r0指向的存储单元低字节数据读取到r1中 ;(高24位清零),并将r2的内容写入到该内存单元中 ;(最低字节有效),复习,单寄存器数据传送,ldr str word ldrb strb byte ldrh strh halfword ldrsb 带符号的byte load ldrsh 带符号的halfword load 存储器系统必须支持所有访问宽度 语法: ldr rd, str rd, e.g. ldreqb,地址访问,ldr/str访问的地址由基址寄存器加上偏移量来产生。 针对word和无符号byte 的访问, 偏移量可以是: 一个无符号12-bit立即数 (如 0 - 4095 bytes). ldr r0,r1,#8 一个寄存器,或再加上移位(由立即数指定) ldr r0,r1,r2 ldr r0,r1,r2,lsl#2 可以是从基址寄存器上加或减去偏移量: ldr r0,r1,#-8 ldr r0,r1,-r2 ldr r0,r1,-r2,lsl#2 对于halfword和带符号的halfword / byte, 偏移量可以是: 一个无符号8 bit 立即数 (如 0-255 bytes). 一个寄存器 (不能偏移)。 可选择采用pre-indexed或post-indexed方式寻址,0x5,0x5,r1,0x200,基址 寄存器,0x200,r0,0x5,源寄存器 for str,偏移量,12,0x20c,r1,0x200,原基址 寄存器,0x200,r0,0x5,源寄存器 for str,偏移量,12,0x20c,r1,0x20c,更新 基址寄存器,通过 str r0,r1,#12!来自动更新基址寄存器,pre or post indexed 寻址?,pre-indexed: str r0,r1,#12,post-indexed: str r0,r1,#12,ldm / stm指令允许一次传送1到16个寄存器到/从存储器中。 寄存器传送顺序不能被指定 最小数字的寄存器总是被传送到/从存储器的最低地址上。 ldmia r10,r0,r1,r4 基址寄存器指定存储器访问开始的地址 块传送指令针对下列情况很有效: 从存储器中搬运一块数据 保存或恢复堆栈中的内容 如果是慢速存储器,会影响中断响应时间,块数据传送,r1,r4,r0,r10,地址增加,ldm / stm 操作,语法: 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,r0,r1,r4,r0,r10,ib,da,db,ldmxx r10, r0,r1,r4 stmxx r10, r0,r1,r4,基址寄存器 (rb),堆栈,100,ff,1234,a0be,8034,arm堆栈操作通过块传送指令来完成: stmfd (push) 块存储- full descending stack stmdb ldmfd (pop) 块装载- full descending stack ldmia,stmfd sp!,r4-r7,lr,在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。 语法: swpb rd, rm, rn,rm,rd,temp,存储器,rn,swp,4.2 指令集介绍,arm指令集分支指令,在arm中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向pc寄存器赋值实现跳转。 分支指令有以下三种: 分支指令b; 带链接的分支指令bl; 带状态切换的分支指令bx。,arm分支指令指令编码,分支指令b/bl指令编码格式,指令执行的条件码,l区别b指令(l为0)和bl指令(l为1),24位有符号立即数(偏移量),分支指令bx指令编码格式,指令执行的条件码,rm目标地址寄存器,该寄存器装载跳转地址,arm指令分支指令,arm指令分支指令,分支指令b指令,该指令跳转范围限制在当前指令的32m字节地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下: bcond label 应用示例: b waita ; 跳转到waita标号处 b 0x1234 ; 跳转到绝对地址0x1234处,arm指令分支指令,带链接的分支指令bl指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到r14(即lr) 连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32m字节地址内。指令格式如下: blcond label,addr1,addr2,1.当程序执行到bl跳转指令时,硬件将下一条指令的地址addr2装入lr寄存器,并把跳转地址装入程序计数器(pc),2. 程序跳转到目标地址label继续执行,当子程序执行结束后,将lr寄存器内容存入pc,返回调用函数继续执行,应用示例(调用子程序): bl label,arm指令分支指令,带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的32m字节地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下: bxcond rm,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的最低位来切换处理器状态,桶型移位器,destination,cf,0,destination,cf,lsl : logical left shift,asr: arithmetic right shift,(无符号数)乘2,除2,并保留符号位,destination,cf,.0,destination,cf,lsr : logical shift right,ror: rotate right,(无符号数)除2,位轮换,destination,rrx: rotate right extended,位轮换,从 cf到msb都参与操作,cf,寄存器, 可选择是否增加移位操作. 移位值可以是: 5 bit 无符号整数 放在另一个寄存器的低字节 用于常数乘法 立即数 8 bit ,大小范围0-255。 右移偶数位 允许直接加载32-bit 常数到寄存器中。,结果,桶型移位器: 第二个操作数,没有任何一条arm 指令可包括一个32 bit的立即数 所有的arm指令都是32 bits固定长度 数据处理指令格式中,第二个操作数有12位 4 bit 移位值 (0-15)乘于2,得到一个范围在0-30,步长为 2的移位值。 记住一条准则: “最后8位一定要移动偶数位”.,0,7,11,8,immed_8,shifter ror,rot,x2,quick quiz: 0xe3a004ff mov r0, #?,立即数 (1),examples: 下列命令中,汇编器把立即数转换为移位操作: mov r0,#4096 ; uses 0x40 ror 26 add r1,r2,#0xff0000 ; uses 0xff ror 16 也可使用 mvn来进行位反转: mov r0, #0xffffffff ; assembles to mvn r0,#0 立即数不能使用上述方法产生,否则将导致错误。,0,31,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,0,0,0,立即数 (2),为允许装载大常数,汇编器提供了一条伪指令: ldr rd, =const 它可能汇编成下列指令: mov or mvn。 或 ldr 指令,从数据池(literal pools)读取常数。 for example ldr r0,=0xff = mov r0,#0xff ldr r0,=0x55555555 = ldr r0,pc,#imm12 dcd 0x55555555 建议把常数装载到寄存器中时一律使用该伪指令。,装载32 bit常数,测验 #1,1. 写一条 arm 指令,分别完成下列操作: a) r0 = 16 b) r0 = r1 / 16 (带符号的数字) c) r1 = r2 * 3 d) r0 = -r0 2. 下面哪些立即数是数据处理指令中有效的数据? a) 0x00ab0000 b) 0x0000ffff c) 0xf000000f d) 0x08000012 e) 0x00001f80 f) 0xffffffff 3. bic指令做什么用? 4. 为什么arm 处理器增加了一条rsb 指令?,start,stop,r0 = r1 ?,r0 r1 ?,r0 = r0 - r1,r1 = 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,新建一个 arm executable image 项目 新建一个 text文件 另存为 “gcd.s” 加入到项目中 build 并执行,乘法,语法: muls rd, rm, rs rd = rm * rs mlas rd,rm,rs,rn rd = (rm * rs) + rn u|smulls rdlo, rdhi, rm, rs rdhi,rdlo := rm*rs u|smlals rdlo, rdhi, rm, rs rdhi,rdlo := (rm*rs)+rdhi,rdlo 占用的周期数 基本 mul 指令 arm7tdmi 上为2-5 周期 strongarm/xscale上为1-3 周期 arm9e/arm102xe上为2 周期 arm9tdmi 比 arm7tdmi多1 周期 累加再多1 周期 (不针对9e,尽管结果延迟多于1周期) 对于“long”型数据,多1 周期 以上均为一般规则,确切细节查看相应手册。,软件中断 (swi),产生一个异常陷阱,跳转到swi 硬件向量。 swi 处理程序可以检测swi号,从而决定采取何种操作。 通过swi机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。 语法: swi ,28,31,24,27,0,cond 1 1 1 1,swi number (ignored by processor),23,条件域,psr 传送指令,mrs和msr允许传送cpsr / spsr中的内容到/从一个通用寄存器中。 语法: mrs rd, ; rd = msr ,rm ; = rm 在这里: = cpsr or spsr _fields = fsxc的任意组合 也允许送一个立即数到 psr_fields msr ,#immediate 用户模式下,所有位均可以被读取,但只有条件标志位 (_f)可被写。,协处理器指令,arm体系支持16个协处理器 针对每个协处理器的指令占用 arm指令集中的固定部分 如果相应的协处理器不存在, 将发生一个未定义指令异常。 这有三种协处理器指令 协处理器数据处理指令 cdp:初始化协处理器数据处理操作 协处理器寄存器传送指令 mrc:从协处理器寄存器移到arm 寄存器 mcr:从 arm 寄存器移到协处理器寄存器 协处理器存储器传送指令 ldc:从存储器装载到协处理器寄存器 stc:从协处理器寄存器存储到存储器,测试 #4,1. 写几条arm 指令,使能irq中断 2. 下列 arm 指令将做什么? a) ldrh r0,r1,#6 b) ldr r0, =0x999 3.在装载或存储指令中, “!”表示什么? 4. 当 执行swi 指令时,会发生什么? 5. swp 指令的优势是什么?,议程,arm 指令集 thumb 指令集 v5te体系结构扩展,0,15,31,0,adds r2,r2,#1,add r2,#1,32-bit arm 指令,16-bit thumb 指令,对于由编译器产生的大部分指令: 没有条件执行 源、目的寄存器必须相同 仅能使用低寄存器 常数大小有限制 不能使用在线移位器,thumb,thumb 是16-bit 指令集 代码密度优化 (总代码大小约为arm指令的65%) 使用窄总线存储器时可以大大提高性能。 是 arm 指令集的一个子集。 核存在一个执行状态 thumb状态 arm和thumb之间切换使用bx 指令,使用branch exchange 指令来完成 interworking bx rn ; thumb 状态下的bx指令 bx rn ; arm状态下的bx指令 也可以只是执行一个绝对跳转,无须状态更换。,arm / thumb 交互工作,rn,bx跳转的地址,31,0,1,31,0,1,arm / thumb 选择 0 - arm 状态 1 - thumb 状态,0,写 thumb汇编程序,thumb不是一个“好” 指令集! 最好用编译器来产生 约束并不一致 代码处理通常优于arm 指令 更多细节,参看: arm “architecture reference manual” chapters a6和a7,议程,arm 指令集 thumb 指令集 v5te体系结构扩展,v5te结构,v5te体系包括全部的 v4t arm和thumb 指令集,还有: 更支持interworking 同时支持arm / thumb状态 breakpoint 指令 (arm和thumb) clz(count leading zeros)指令 扩展协处理器指令 - mcr2等等 支持饱和处理 封装的带符号的半字乘法指令 双字装载/ 存储指令 cache预装载指令 双字协处理器 传送指令 - mcrr/mrrc,你采用的处理器是哪种结构?,处理器核 结构体系 7tdmi & 9tdmi v4t 9e-s rev1 v5te 926ej-s/1026ej-s v5tej 1020e v5te strongarm v4 xscale microarchitecture v5te,前导零计数指令,clzcond rd, rm 计算寄存器中的值有多少个前导0 源寄存器从最高位开始计算。 1个周期完成 (arm9e-s/arm102x) 如果没有任何一位被置位,结果是32;如果 bit 31被置位,结果为0。 rm 左移 rd位即可标准化rm 带符号的标准化需要额外的 1个周期,0000 0010 1110 1101.0,r0 =,clz r1, r0,0x6,r1 =,1011 1011 0100 0000.0,rm =,mov r0, r0 lsl r1,eor r1, r0, r0, lsl#1 clz r1, r1 mov r0, r0, lsl r1,扩展协处理器指令,cdp2, ldc2, stc2, mcr2, mrc2 新格式的标准协处理器指令为协处理器设计人员提供了附加的操作码空间。 同样是无条件执行的,t,rm,rs,b,t,b,w option,16,16,16,16,32,16,32/64,32/64,rd (rdhi,rdlo),rn (rdhi,rdlo),新的有符号乘法操作,smulxycond rd, rm, rs smulwycond rd, rm, rs smlaxycond rd, rm, rs, rn smlawycond rd, rm, rs, rn smlalxycond rdlo, rdhi, rm, rs smla 指令影响标志位q x, y 用于选择寄存器的高一半和低一半 w 用于选择48位结果的高32位 不影响 nzcv (没有s位),1) 写一段汇编代码 qtest 测试标志位 q 并清零。 源文件模板在文件 asmdsp.s 中给出 返回根据标志位q的值 2) 写一段汇编主程序,累加16位有符号数组的所有元素的平方。 int total=0; for (n=0; n64; n+) total += xn*xn; 取值指令 使用ldrh 平方累加指令使用 smlabb 3) 是否存在互锁? 4) 使用axd检查 q标志位(通过改变cpsr模式为 e-psr) 5) 在循环后面增加一个 bl 调用 qtest 并检查返回值 6) 专家题: 改用 ldr,每次取两个值 7) 专家题: 修改代码,使用64位累加器,测试 #5 - dsp power calculation,x,x0,x1,x2,x3,x4,x63,r0,x62,x5,饱和算术,0x7fffffff 加上1产生一个负的结果 0x80000000 减去1,会产生一个正的结果 饱和算术指令会区分这两种情况,使得在最大值和最小值越界时产生饱和 经常用于表示 1 到 -1 “q31” 算术 axd 可以显示 q31 格式,0x0,0x7fffffff,0x80000000,-ve,+ve,- most positive number,- most negative number,饱和算术指令,饱和算术在几个通信dsp算法中是必须的 g.723.1 - voip amr - adaptive multirate qsubcond rd, rm, rn rd = saturate(rm - rn) qaddcond rd, rm, rn rd = saturate(rm + rn) qdsubcond rd, rm, rn rd = saturate(rm - saturate(rn2) qdaddcond rd, rm, rn rd = saturate(rm + saturate(rn2) 这些指令影响标志位q,r1 = 0x7f000000,saturate,r2 = 0x00001000,

温馨提示

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

评论

0/150

提交评论