【文档说明】嵌入式微处理器-第2章-指令系统课件.ppt,共(73)页,446.012 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92643.html
以下为本文档部分文字说明:
1第2章指令系统计算机体系结构的分类ARM处理器SHARC处理器2VonNeumann体系结构数据和指令都存放在存储器里。计算机从存储器取指令。CPU与存储器分离的是存储程序计算机。CPU寄存
器主要用于程序计数器PC3VonNeumann体系结构memoryCPUPCaddressdataIRADDr5,r1,r3200200ADDr5,r1,r34Harvard体系结构CPUPCdatamemoryprogrammemory
addressdataaddressdata5vonNeumann与Harvard体系结构Harvard不能够使用自修改编码Harvard可以同时进行两个存取工作。多数DSP使用Harvard体系结构。更大的存储带宽。带宽的可预见性更
强6RISC与CISCComplexinstructionsetcomputer(CISC):复杂指令集计算机多种类型的指令变长型指令程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执
行的。优点是控制简单,但计算器各部分的利用率不高,执行速度慢。Reducedinstructionsetcomputer(RISC):精简指令集计算机种类比较少管道化的指令寻址方式也比复杂指令集少数据管道是在同一个应用中对象之间快速传送数据的小型统一部件,比信息(message)传输
的方式更块7指令集的特点固定长度与可变长度寻址模式操作数的个数操作数的类型成功的体系结构应用广泛。时钟速度可变;不同的总线宽度;不同的缓存规模8ARM版本ARM结构被扩展成为多个版本。本课将集中在ARM7ARM7是v
onNeumann结构的ARM9是Harvard结构的。9汇编语言汇编语言指令与翻译成的机器语言指令之间基本是一一对应的关系基本特点:一个指令一行;给内存单元提供名字的标记LABEL,由第一列开始。指令通常在随后的列开始。注释以分号开头,分号右边的内容将被汇
编程序忽略10ARM汇编语言相当标准的汇编语言:LDRr0,[r8];acommentlabelADDr4,r0,r111ARM汇编语言例子label1ADRr4,cLDRr0,[r4];acommentADRr4,dLDRr1,[
r4]SUBr0,r0,r1;comment12r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15(PC)CPSR310NZCVARM编程器模型16个通用寄存器,包括PC一个状态寄存器Current.Pr
ogramStatusRegister13字节的排列顺序ARM允许32位长地址,但每个地址访问是一个字节而不是一个字。byte3byte2byte1byte0byte0byte1byte2byte3位31位0低序高序word4word
0word4word0位31位014ARM数据类型32位字长分成四个8位的字节ARM地址可是32位长。地址是以字节来引用的。可在加电时设置高序或低序。15ARM状态位第个算术、逻辑或位移运算都会调整CPSR位:N(negat
ive),Z(zero),C(carry),V(overflow).例如:-1=0xffffffff1==0x1-1+1=0:NZCV=0110.0–1=-1:0x0–0x1=0xffffffffNZCV=1000231-1+1=-2
31:0x80000000+0fffffff0x7fffffff+0x1=0x80000000NZCV=1001.16ARM数据指令基本形式:ADDr0,r1,r2把r1+r2的值存储在r0中立即操作数:ADDr0,r1,#2将r1
+2的值存储在r0中。17ARM数据指令ADD,ADC:add(w.carry)SUB,SBC:subtract(w.carry)RSB,RSC:reversesubtract(w.carry)MUL,MLA:multiply(andaccumulate)AND,O
RR,EORBIC:bitclearLSL,LSR:logicalshiftleft/rightASL,ASR:arithmeticshiftleft/rightROR:rotaterightRRX:ro
taterightextendedwithC18数据操作的不同方法逻辑位移:补“0”算术位移:在右移时以符号位来充填。RRX执行的是33位的循环,包括来自在符号位上的CPSR的C位。19ARM比较指令CMP:比较CMN:负数比较TST:按位测试(与)
TSTR0,#0X0f;判断R0的低4位是否为0TEQ:按位求反测试(异或)TEQR0,R1;比R0,R1是否相等这些操作的结果只是去更新CPSR中的NZCV位。20ARM数据传送指令MOV,MVN:数据非传送MOVr0,r1;将r1的内容放入r0MVNR
1,#0xFF;R=0xFFFFF0021ARM存储器访问指令LDR,LDRH,LDRB:load(half-word,byte)STR,STRH,STRB:store(half-word,byte)寻址模式:寄存器间接寻址:LDRr0,[r1]有第二个寄存器:LDR
r0,[r1,-r2]带常数的:LDRr0,[r1,#4]存储器指令不直接访问主存储器地址。通常由PC计算后给出一个地址。ADR伪操作产生一个要求计算地址的指令:ADRr1,FOO22例:C的赋值语句C:x=(a+b)
-c;汇编语言:ADRr4,a;getaddressforaLDRr0,[r4];getvalueofaADRr4,b;getaddressforb,reusingr4LDRr1,[r4];getvalueofbADDr3,r0,r1;computea+bADRr4,c;getaddre
ssforcLDRr2,[r4];getvalueofcSUBr3,r3,r2;completecomputationofxADRr4,x;getaddressforxSTRr3[r4];storevalueofx23例:C的赋值语句C:y=a*(b+c);汇编语言:ADRr4,b;geta
ddressforbLDRr0,[r4];getvalueofbADRr4,c;getaddressforcLDRr1,[r4];getvalueofcADDr2,r0,r1;computepartialresultADRr4,a;getaddressforaLDRr0,[r4];ge
tvalueofaMULr2,r2,r0;computefinalvalueforyADRr4,y;getaddressforySTRr2,[r4];storey24例:C的赋值语句C:z=(a<<2)|(b&15);汇编语言:(registerreuse)ADRr4,a;getadd
ressforaLDRr0,[r4];getvalueofaMOVr0,r0,LSL2;performshiftADRr4,b;getaddressforbLDRr1,[r4];getvalueofbANDr1,r1,#15
;performANDORRr1,r0,r1;performORADRr4,z;getaddressforzSTRr1,[r4];storevalueforz25多种寻址方式寄存器寻址MOVR1,R2;R2->R1SUBR0,R1,R2;R1-R2->R0立即寻址SUBSR0,R0,#1;R0
–1->R0MOVR0,#0xff00;0xff00->R0寄存器间接寻址LDRR1,[R2];将R2中的数值作为地址,取出此地址中的数据保存在R1中。SWPR1,R1,[R2];将如中的数值作为地址,取
出此地址中的数值与R1中的值交换26多种寻址方式基址加偏移量寻址(基址寻址)LDRr0,[r1,#16]将存储在地址r1+16单元的值装入r0自动变址寻址:LDRr0,[r1,#16]!将16与r1的值相加,然后把这个值作为地址。后
变址寻址LDRr0,[r1],#16将r1给定地址的存储单元中的值装入r0,然后把r1的值加16并将新值赋给r1.27ARM控制流B指令(Branchoperation)B#100在PC的值上加400任何分支指令都可有条件地执
行。是ARM中改变控制流的基本机制。分支的目的地址称为分支目标。分支是与程序计数器相关的,分支指明了从当前程序计数器到分支目标的偏移量,这个偏移量的单位是字。由于ARM是对字节定址的,所以要把偏移量乘4。2829例:if语句在ARM中的实现C:if(a>b){x=5;y
=c+d;}elsex=c-d;汇编:;computeandtestconditionADRr4,a;getaddressforaLDRr0,[r4];getvalueofaADRr4,b;getaddressforbLDRr1,[r4];getvalueforbCMPr0,r1;comp
area<bBGEfblock;ifa>=b,branchtofalseblock;trueblockMOVr0,#5;generatevalueforxADRr4,x;getaddressforxSTRr0,[r4];storexADRr4,c;getaddress
forc30If语句LDRr0,[r4];getvalueofcADRr4,d;getaddressfordLDRr1,[r4];getvalueofdADDr0,r0,r1;computeyADRr4,y;getaddressforySTRr0,[r4];sto
reyBafter;brancharoundfalseblock;falseblockfblockADRr4,c;getaddressforcLDRr0,[r4];getvalueofcADRr4,d;getaddressfordLDRr1,[r4];getvaluefordSUB
r0,r0,r1;computec-dADRr4,x;getaddressforxSTRr0,[r4];storevalueofxafter...31例:条件执行使用判断来控制执行那条指令:;trueblock,条件代码由CMP更新;non
eedfor“BGEfblock”and“Bafter”MOVLTr0,#5;generatevalueforxADRLTr4,x;getaddressforxSTRLTr0,[r4];storexADRLTr4,
c;getaddressforcLDRLTr0,[r4];getvalueofcADRLTr4,d;getaddressfordLDRLTr1,[r4];getvalueofdADDLTr0,r0,r1;compute
yADRLTr4,y;getaddressforySTRLTr0,[r4];storey32例:条件执行;falseblockADRGEr4,c;getaddressforcLDRGEr0,[r4];getv
alueofcADRGEr4,d;getaddressfordLDRGEr1,[r4];getvaluefordSUBGEr0,r0,r1;computea-bADRGEr4,x;getaddressforxSTRGEr0,[r4];storevalueofx
条件执行相对于较少的条件是最好的。33例:用于多分支选择的switch语句C:switch(test){case0:…break;case1:…break;…}汇编:ADRr2,test;getaddressfortestLDRr0,[r2];
loadvaluefortestADRr1,switchtab;loadaddressforswitchtableLDRr15,[r1,r0,LSL#2];indexswitchtableswitch
tabDCDcase0DCDcase1...LDR:把r0移2位把偏移量转换成为字节地址把存储器[r1+r0]的值装入PCr15中34例:FIR滤波器C(FIR)滤波器:for(i=0,f=0;i<N;i++)f=f+c[i]*x[i]
;/*x[i]:周期性的采样*/汇编语言;循环初始代码MOVr0,#0;user0forIMOVr8,#0;useseparateindexforarraysADRr2,N;getaddressfor
NLDRr1,[r2];getvalueofNMOVr2,#0;user2forfADRr3,c;loadr3withbaseofcADRr5,x;loadr5withbaseofx35例:FIR滤波器;循环代码loopLDRr4,[r3,r8];getc[i]LDRr6,[r5,r8];ge
tx[i]MULr4,r4,r6;computec[i]*x[i]ADDr2,r2,r4;addintorunningsumADDr8,r8,#4;add1wordoffsettoarrayindexADDr0,r0,#1
;add1toiCMPr0,r1;exit?BLTloop;ifi<N,continue36ARM子程序的链接分支和链接指令:BLfoo把当前的PC值存入r14.从一个子程序返回:MOVr15,r1437嵌套
的子程序调用嵌套/递归C:voidf1(inta){f2(a);}汇编语言:f1LDRr0,[r13];loadargintor0fromstack;r13isstackpointer;callf2()STRr13!,[r14];st
oref1’sreturnadrsSTRr13!,[r0];storeargtof2onstackBLf2;branchandlinktof2;returnfromf1()SUBr13,#4;popf2’sargoffstackLDRr13!,r15;r
estoreregandreturn38SHARC编程模型SHARC汇编语言SHARC存储器的组织SHARC数据操作SHARC控制流程SHARC处理器39SHARC编程模型寄存器文件:R0-R15(对浮点运算的名称为F0-F15)
所有的这些寄存器都是40位长支持单精度浮点格式、32位定点格式和提高精度的40位扩展格式状态寄存器ASTAT:算术状态。(记录ALU,移位器和乘法器状态)STKY:sticky.(是状态寄存器中某些们的
粘性值,需要指令才能清除)MODE1:mode1.控制定点运算的饱和算术操作和浮点运算的舍入模式循环寄存器。数据地址生成寄存器。中断寄存器。40SHARC汇编语言算术符号由分号结束,注释由感叹号开始:R
1=DM(M0,I0),R2=PM(M8,I8);!commentlabel:R3=R1+R2;数据存储器的存取程序存储器的存取41SHARC数据类型32位IEEE单精度浮点。40位IEEE扩展精度浮点。32位整型。存储器内部是用32位地址的32位字长进行组织。一条指令为48位。ALU
支持饱和算术运算。(ALUSAT位为MODE1)42SHARC结构修改的哈佛结构程序存储存储器可以用来存放一些数据。寄存器文件联接到:乘法器移位器ALU4344乘法器定点运算可累计到MR(modifyreg
ister)寄存器或被写入寄存器文件。定点的结果为80位。浮点的结果总是送到寄存器文件中。状态位:负、下溢、上溢、无效、定点、浮点下溢、浮点无效。45ALU/移位器状态标记ALU:零AZ、溢出AV、负
AN、定点进位AC、输入符号、浮点无效AI、最新运行为浮点运算、比较累加寄存器、浮点下溢/上溢、定点溢出、浮点无效等。移位器零SZ、溢出SV、符号SS46标记操作所有的ALU操作都要设置ASTAT中的AZ(zero),AN(negative),AV(overfl
ow),AC(fixed-pointcarry),AI(floating-pointinvalid)位。STKY是算术逻辑单元中的某些位的粘性版本。47例:数据操作定点-1+1=0:AZ=1,AU=0(浮点下溢),AN=0,AV
=0,AC=1,AI=0.STKY的AOS位(fixedpointunderflow)未设置。定点-2*3:MN=1,MV=0,MU=1,MI=0.4个STKY位都没有设置:MOS(mult.fixed-poin
toverflow),MVS(floating-pointoverflow),MUS(mult.floatingpointunderflow),MIS(mult.floating-pointinvalidoperation)0x7fffffff左移3位:
SZ=0,SV=1,SS=0.48乘法计算可进行某些并行的计算:加减二重计算;定点乘/累加与加、减、计算平均值;浮点乘与ALU操作;乘与加减二重计算。乘法器的操作数从R0-R7,ALU的操作数从R8-R15.49SHARC存取存取结构:无直接存储器
操作。两个数据地址生成器(DAGs):程序存储器数据存储器必须设置DAG寄存器来控制存取操作。50DAG1寄存器I0I1I2I3I4I5I6I7M0M1M2M3M4M5M6M7L0L1L2L3L4L5L6L7B0B1B2B3B4B5B6B7每个DAG有四种寄存器:Index(I),Modi
fy(M),Base(B)Length(L)51数据地址生成器DAG提供索引,余数、位反转变址寻址MODE1的位决定是主寄存器还是备用寄存器工作。52基本的寻址方式立即值:R0=DM(0x200
00000);直接装入:R0=DM(_a);!Loadscontentsof_a!_a是变量a的地址直接存储:DM(_a)=R0;!StoresR0at_a53具有更新的后修改模式I寄存器指定基址。M寄存器:直接保存变址数。R0=DM(I3,M3)!LoadDM(I2,1)=R1!S
toreI寄存器被变址数更新基址加偏移量:R0=DM(M1,I0)!LoadfromM1+I0循环缓冲:I指针和存储。M为前移地址的增量值。L循环缓冲器的数量。M循环缓冲器的基址5455程序存储器中的数据数据可以被存储在程序存储器中,每个
周期可读两次:F0=DM(M0,I0),F1=PM(M8,I9);编译器可以使程序员控制存储到那个存储器。56例:C赋值C:x=(a+b)-c;汇编:R0=DM(_a);!LoadaR1=DM(
_b);!LoadbR3=R0+R1;R2=DM(_c);!LoadcR3=R3-R2;DM(_x)=R3;!Storeresultinx57例:C赋值C:y=a*(b+c);汇编:R1=DM(_b);!LoadbR2=DM(_c);!Loa
dcR2=R1+R2;R0=DM(_a);!LoadaR2=R2*R0;DM(_y)=R2;!Storeresultiny58例:C赋值可用指针来缩短代码的长度:!Loadb,cR2=DM(I1,M5),R1
=PM(I8,M13);R0=R2+R1,R12=DM(I0,M5);R6=R12*R0(SSI);DM(I0,M5)=R8;!Storeiny59例:C赋值C:z=(a<<2)|(b&15);汇编:R0=DM(_a);!LoadaR0=LSHIFTR0by#2;!Lefts
hiftR1=DM(_b);R3=#15;!LoadimmediateR1=R1ANDR3;R0=R1ORR0;DM(_z)=R0;60SHARC程序排序器特点:指令缓存;32字的缓存,3总线PC堆栈;PC与栈一起存储返回地址和循环顶的地址状态寄存器;PC栈的栈满,空标志;状态栈和循环栈
的溢出,空标志;循环逻辑;地址,计数,控制。数据地址产生器。61条件指令指令是有条件地执行的。条例来自:算术状态(ASTAT);模式控制1(MODE1);标志输入;循环计算器62SHARC控制流改变控制流:JUMPfoo三种
寻址方式:直接寻址:直接给出一个24位的地址,并用这个地址去设置PC。IFAVJUMP(PC,0x00A4)(LA);间接寻址:由DAG2给出地址;IFTFJUMP(M8,I8),!TF位测试标记相对PC寻址:立即数加PC得到一个新的地址。IFNEJUMP(PC,0x20),63
分支类型:CALL,JUMP,RTS,RTI.(returnfromsubroutine|interrupt)可为条件执行。可为直接寻址,间接寻址,相对PC寻址。可以为延时和非延时。JUMP产生自动循环中止。64例:C中的if语句C:if(a>b){x=5;
y=c+d;}elsex=c-d;汇编:!TestR0=DM(_a);R1=DM(_b);COMP(R1,R0);!CompareIFGEJUMPfblock;65C中的if语句!Trueblocktbl
ock:R0=5;!GetvalueforxDM(_x)=R0;R0=DM(_c);R1=DM(_d);R1=R0+R1;DM(_y)=R1;JUMPother;!Skipfalseblock!Falseblockfblock:R0=DM(_c);R1
=DM(_d);R1=R0-R1;DM(_x)=R1;other:!Codeafterif66特别的if语句的实现C:if(a>b)y=c-d;elsey=c+d;用并行机制来提高速度---计算两种情况,然后选一个保存。67特别的if语句的实现!Loa
dvaluesR1=DM(_a);R8=DM(_b);R2=DM(_c);R4=DM(_d);!ComputebothsumanddifferenceR12=r2+r4,r0=r2-r4;!Choosewhich
onetosavecomp(r8,r1);ifger0=r12;dm(_y)=r0!Writetoy68DOUNTIL循环DOUNTIL指令提供有效的循环:LCNTR=30,DOlabelUNTILLCE;R0=DM(I0,M0),
F2=PM(I8,M8);R1=R0-R15;label:F4=F2+F3;循环长度循环中的最后一条指令终止条件69例:FIR滤波器C:for(i=0,f=0;i<N;i++)f=f+c[i]*x[i]
;!setupI0=_a;I8=_b;!a[0](DAG1),b[0](DAG2)M0=1;M8=1!Setupincrements!LoopbodyLCNTR=N,DOloopendUNTILLCE;!Usepostincreme
ntmodeR1=DM(I0,M0),R2=PM(I8,M8);R8=R1*R2;loopend:R12=R12+R8;70优化FIR滤波器代码I4=_a;I12=_b;R4=R4xorR4,R1=DM(I4,M6),R2=PM(I12,M14);MR0F=R4,MODIFY(I7
,M7);!StartloopLCNTR=20,DO(PC,loop)UNTILLCE;loop:MR0F=MR0F+R2*R1(SSI),R1=DM(I4,M6),R2=PM(I12,M14);!LoopcleanupR0=MR0F;71SHARC子程序调用作用CALL指令:CALLfoo
;绝对地址寻址,间接寻址,相对PC寻址模式。使用RTS返回指令。72PC堆栈PC栈:30区X24条指令。子程序的返回,中断业务程序,循环保存在PC栈内。73例:C函数C:voidf1(inta){
f2(a);}Assembler:f1:R0=DM(I1,-1);!LoadargintoR0DM(I1,M1)=R0;!Pushf2’sargCALLf2;MODIFY(I1,-1);!PopelementRTS;