浙江大学ARM课件3_第1页
浙江大学ARM课件3_第2页
浙江大学ARM课件3_第3页
浙江大学ARM课件3_第4页
浙江大学ARM课件3_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

ARM及Thumb指令集

课程安排ARM根本寻址方式ARM指令集 Thumb指令集 v5TE体系结构扩展存放器寻址存放器的内容为操作数ADDR0,R1,R2R0R1+R2立即寻址操作数直接包含在指令中ADDR3,R3,#1R3R3+1ANDR8,R7,#0xFF1R8

R7[7:0]存放器移位寻址存放器操作数需要经过移位后参与第一个操作数操作ADDR3,R2,R1,LSL#3R3R2+8xR1移位操作如下几种LSR\LSL〔逻辑移位〕ASR〔算术右移〕\ROR〔循环右移〕RRX〔带C循环移位〕存放器间接寻址被指定的存放器中存放的是操作数的有效地址LDRR0,[R1]

R0

[R1]

STRR0,[R1]

R0

[R1]变址寻址基址存放器中的内容与指令中给出的位移量(最大4K)相加,形成操作数的有效地址前索引寻址LDRR0,[R1,#4]

R0

[R1+4]带自动索引的前索引寻址

LDRR0,[R1,#4]!R0

[R1+4];R1R1+4后索引寻址

LDRR0,[R1],#4

R0

[R1];R1R1+4基址加索引寻址LDRR0,[R1,R2]

R0

[R1+R2]多存放器寻址/块拷贝寻址一次可以传送几个存放器的值,允许一条指令传送16个存放器的任何子集LDMIAR1,{R0,R2,R5}

R0

[R1];R2[R1+4];

R5

[R1+8]堆栈寻址向上生长:----递增堆栈向下生长:----递减堆栈满堆栈:----指向最后压入堆栈的有效数据项空堆栈:----指向下一个数据项放入的空位置ARM处理器支持4种类型堆栈满递增空递增满递减空递减相对寻址基址寻址中用PC提供基准地址,指令中的地址码字段作为位移量BLsubr……Subr:……. MOVPC,R14课程安排ARM根本寻址方式ARM指令集 Thumb指令集 v5TE体系结构扩展ARM指令编码格式说明Cond指令执行的条件编码Opcode指令操作符编码S决定指令的操作是否影响CPSR的值Rd操作目标存放器编码Rn包含第一操作数的存放器编码Shifter_operand表示第二操作数cond001opcodesRnRdShifter_operand31 2827

2524212019 16151211870ARM指令可以通过添加适当的条件码后缀来到达条件执行的目的。这样可以提高代码密度,减少分支跳转指令数目,提高性能。CMPr3,#0CMPr3,#0

BEQskipADDNEr0,r1,r2

ADDr0,r1,r2

skip默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S〞来影响标志位。CMP不需要增加“S〞就可改变相应的标志位。 loop

SUBSr1,r1,#1

BNEloop条件执行及标志位如果Z标志清零则跳转R1减1,并设置标志位ConditionCodes不等于(Notequal) 无符号的大于或等于无符号的小于负数(Minus)等于(Equal)溢出(Overflow)没溢出无符号的大于无符号的小于或大于正数或零小于(LessThan)大于(GreaterThan)小于等于总是执行(Always)大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1测试的标志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出条件执行例如一系列的指令都使用条件指令 if(a==0)func(1); CMPr0,#0

MOVEQr0,#1

BLEQfunc

置标志位,再使用不同的条件码 if(a==0)x=0;

if(a>0)x=1; CMPr0,#0

MOVEQr1,#0

MOVGTr1,#1

使用条件比较指令 if(a==4||a==10)x=0; CMPr0,#4

CMPNEr0,#10

MOVEQr1,#0Branch: B{<cond>}labelBranchwithLink: BL{<cond>}subroutine_label(下条指令地址送到R14)处理器把偏移量左移两位,进行符号扩展后再与PC相加

跳转范围:±32Mbyte如何执行长跳转?2831240

Cond101L偏移量 条件码区域Linkbit 0=Branch 1=Branchwithlink232527分支指令数据处理指令包括:算术指令: ADD ADC SUB SBC RSB RSC逻辑指令: AND ORR EOR BIC比较指令: CMP CMN TST TEQ数据搬移: MOV MVN上述指令只能对存放器操作,不能针对存储器。

语法: <操作>{<cond>}{S}Rd,Rn,Operand2只有比较指令影响标志位-不指定Rd数据搬移不指定Rn第二个操作数通过桶型移位器送到ALU中。桶型移位器DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift〔无符号数〕乘2除2,并保存符号位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight〔无符号数〕除2位循环

DestinationRRX:RotateRightExtended位轮换,从CF到MSB都参与操作CF存放器,可选择是否增加移位操作.移位值可以是:5bit无符号整数放在另一个存放器的低字节用于常数乘法立即数8bit,大小范围0-255。右移偶数位允许直接加载32-bit常数到存放器中。结果操作数1Barrel

Shifter操作数2ALU桶型移位器:

第二个操作数没有任何一条ARM指令可包括一个32bit的立即数所有的ARM指令都是32bits固定长度数据处理指令格式中,第二个操作数有12位4bit移位值(0-15)乘于2,得到一个范围在0-30,步长为2的移位值。记住一条准那么:“最后8位一定要移动偶数位〞.07118immed_8Shifter

RORrotx2QuickQuiz:

0xe3a004ff

MOVr0,#???立即数(1)Examples:以下命令中,汇编器把立即数转换为移位操作:MOVr0,#4096 ;uses0x40ror26ADDr1,r2,#0xFF0000 ;uses0xFFror16也可使用MVN来进行位反转:MOVr0,#0xFFFFFFFF ;assemblestoMVNr0,#0使用无法用上述方法生成的数据,将产生错误。031ror#0range0-0xff000000step0x01000000ror#8range0-0x000000ffstep0x00000001range0-0x000003fcstep0x00000004ror#30000000000000000000000000000000000000000000000000000000000000000000000000立即数(2)为允许装载大常数,汇编器提供了一条伪指令:LDRrd,=const它可能汇编成以下指令:MOVorMVN。 或LDR指令,从数据池〔Literalpools〕读取常数。ForexampleLDRr0,=0xFF => MOVr0,#0xFFLDRr0,=0x55555555 => LDRr0,[PC,#Imm12]

DCD0x55555555推荐使用这种方法把常数装入存放器。装载32bit常数Quiz#11.写一条ARM指令,分别完成以下操作: a)r0=16 b)r0=r1/16 (带符号的数字) c)r1=r2*3 d)r0=-r02.下面哪些立即数是数据处理指令中有效的数据? a)0x00AB0000b)0x0000FFFFc)0xF000000F d)0x08000012e)0x00001f80f)0xFFFFFFFF3.BIC指令做什么用?4.为什么ARM处理器增加了一条RSB指令?StartStopr0=r1

?r0>r1

?r0=r0-r1r1=r1-r0YesNoYesNo你只需要使用CMP、SUB和B指令。充分使用条件执行!

AREAmyarea,CODE ENTRY MOVr0,#n1 MOVr1,#n2start ;yourcodeherestop Bstop ENDQuiz#2程序结构如下:完成流程图所对应的程序乘法语法:MUL{<cond>}{S}Rd,Rm,Rs Rd=Rm*RsMLA{<cond>}{S}Rd,Rm,Rs,Rn Rd=(Rm*Rs)+Rn[U|S]MULL{<cond>}{S} RdLo,RdHi,Rm,Rs RdHi,RdLo:=Rm*Rs[U|S]MLAL{<cond>}{S}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周期以上均为一般规那么,确切细节查看相应手册。单存放器数据传送

LDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB 带符号的byteloadLDRSH 带符号的halfwordload存储器系统必须支持所有访问宽度语法:

LDR{<cond>}{<size>}Rd,<address>STR{<cond>}{<size>}Rd,<address>e.g.LDREQB地址访问LDR/STR访问的地址由基址存放器加上偏移量来产生。针对word和无符号byte的访问,偏移量可以是:一个无符号12-bit立即数(如0-4095bytes).

LDRr0,[r1,#8]一个存放器,或再加上移位〔由立即数指定〕

LDRr0,[r1,r2]

LDRr0,[r1,r2,LSL#2]可以是从基址存放器上加或减去偏移量:

LDRr0,[r1,#-8]

LDRr0,[r1,-r2]

LDRr0,[r1,-r2,LSL#2]对于halfword和带符号的halfword/byte,偏移量可以是:一个无符号8bit立即数(如0-255bytes).一个存放器(不能移位)。可选择采用pre-indexed或post-indexed方式寻址0x50x5r10x200基址

存放器0x200r00x5源存放器

forSTR偏移量120x20cr10x200原基址

存放器0x200r00x5源存放器

forSTR偏移量120x20cr10x20c更新

基址存放器通过STRr0,[r1,#12]!来自动更新基址存放器PreorPostIndexed寻址?

Pre-indexed:STRr0,[r1,#12]

Post-indexed:STRr0,[r1],#12编写一个ARM汇编程序,累加一个队列中的所有元素,碰上0时停止。结果放入r4。在源文件末尾按如下方式声明队列:

myarray

DCD0x11

DCD0x22

DCD0用r0指向队列的入口

ADRr0,myarray

使用LDRr1,[r0],#4从队列中装载数据累加并放入r4循环,直到r1为0停止,进入死循环Quiz#3-Totalofarray0x2200x11r0地址增加LDM/STM指令允许一次传送1到16个存放器到/从存储器中。存放器传送顺序不能被指定最小数字的存放器总是被传送到/从存储器的最低地址上。 LDMIA r10,{r0,r1,r4}基址存放器指定存储器访问开始的地址

快传送指令针对以下情况很有效:从存储器中搬运一块数据保存或恢复堆栈中的内容如果是慢速存储器,会影响中断响应时间块数据传送r1r4r0r10地址增加LDM/STM操作语法:<LDM|STM>{<cond>}<addressing_mode>Rb{!},<存放器list>4中寻址操作:LDMIA/STMIA IncrementAfter〔先操作,后增加〕LDMIB/STMIB IncrementBefore〔先增加,后操作〕LDMDA/STMDA DecrementAfter〔先操作,后递减〕LDMDB/STMDB DecrementBefore〔先递减,后操作〕IAr1地址增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxxr10,{r0,r1,r4}STMxxr10,{r0,r1,r4}基址存放器(Rb)存储器块拷贝可选项“!〞将导致LDM/STM指令去自动更新基址存放器后缀为IA,IB时,加上4乘以用于传送的存放器的数目的值后缀为DA,DB时,减去4乘以用于传送的存放器的数目的值例如:;r12指向源数据起始地址;r14指向源数据尾地址;r13指向目的数据起始地址loop LDMIA r12!,{r0-r11} ;装载48bytes STMIA r13!,{r0-r11} ;和存储them CMP r12,r14 ;checkfortheend BNE loop ;和loopuntildone此循环传送48bytes占用了31周期时钟为33MHz时传输速率超过50Mbytes/sec存储器增加r13r14r12LDMFDsp!,{r4-r7,pc}SP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存储器顶SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆栈操作通过块传送指令来完成:STMFD

(Push) 块存储-FullDescendingstack[STMDB]LDMFD

(Pop) 块装载-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}在存放器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:SWP{<cond>}{B}Rd,Rm,[Rn]可用作信号量不能由armcc编译产生,必须使用汇编器。RmRd321temp存储器RnSWP软件中断(SWI)产生一个异常陷阱,跳转到SWI硬件向量。SWI处理程序可以检测SWI号,从而决定采取何种操作。通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:

SWI{<cond>}<SWInumber>283124270

Cond1111SWInumber(ignoredbyprocessor)23条件域PSR传送指令MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用存放器中。语法:MRS{<cond>}Rd,<psr>;Rd=<psr>MSR{<cond>}<psr[_fields]>,Rm;<psr[_fields]>=Rm在这里:<psr>=CPSRorSPSR[_fields]=‘fsxc’的任意组合也允许送一个立即数到psr_fieldsMSR{<cond>}<psr_fields>,#Immediate用户模式下,所有位均可以被读取,但只有条件标志位(_f)可被写。2731NZCVQ2867IFTmode1623

815

54024fsxc

UndefinedJ协处理器指令ARM体系支持16个协处理器针对每个协处理器的指令占用ARM指令集中的固定局部如果相应的协处理器不存在,将发生一个未定义指令异常。这有三种协处理器指令协处理器数据处理指令CDP:初始化协处理器数据处理操作协处理器存放器传送指令MRC:从ARM存放器移到协处理器存放器MCR:从协处理器存放器移到ARM存放器协处理器存储器传送指令LDC:从存储器装载到协处理器存放器STC:从协处理器存放器存储到存储器Quiz#41.写几条ARM指令,使能IRQ中断2.以下ARM指令将做什么? a)LDRHr0,[r1,#6] b)LDRr0,=0x9993.在装载或存储指令中,“!〞表示什么?4.当执行SWI指令时,会发生什么?5.SWP指令的优势是什么?课程安排

ARM指令集Thumb指令集

v5TE体系结构扩展015310ADDSr2,r2,#1ADDr2,#132-bitARM指令16-bitThumb指令对于由编译器产生的大局部指令:没有条件执行源、目的存放器必须相同仅能使用低存放器常数大小有限制不能使用在线移位器ThumbThumb是16-bit指令集代码密度优化〔总代码大小约为ARM指令的65%〕使用窄总线存储器时可以大大提高性能。是ARM指令集的一个子集。核存在一个执行状态–Thumb状态ARM和Thumb之间切换使用BX指令使用BranchExchange

指令来完成InterworkingBXRn

;Thumb状态下的Bx指令BX<condition>Rn

;ARM状态下的Bx指令也可以只是执行一个绝对跳转,无须状态更换。ARM/ThumbInterworkingRnBX跳转的地址31013101ARM/Thumb选择0-ARM状态1-Thumb状态0写Thumb汇编程序Thumb不是一个“好〞指令集!最好用编译器来产生约束并不一致手动编码使用ARM指令集比较好更多细节,参看:ARM“ArchitectureReferenceManual〞ChaptersA6和A7课程安排

ARM指令集 Thumb指令集v5TE体系结构扩展v5TE结构v5TE体系包括全部的v4TARM和Thumb指令集,还有:增强的interwor

温馨提示

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

评论

0/150

提交评论