1、第 2章指令系统 计算机体系结构的分类 ARM 处理器 SHARC处理器1Von Neumann 体系结构p数据和指令都存放在存储器里。p计算机从存储器取指令。nCPU与存储器分离的是存储程序计算机。pCPU 寄存器主要用于程序计数器PC2Von Neumann 体系结构memoryCPUPCaddressdataIRADD r5,r1,r3200200ADD r5,r1,r33Harvard 体系结构 CPUPCdata memoryprogram memoryaddressdataaddressdata4von Neumann 与 Harvard体系结构pHarvard 不能够使用自修改编
2、码pHarvard 可以同时进行两个存取工作。p多数DSP使用Harvard体系结构。n更大的存储带宽。n带宽的可预见性更强5RISC 与 CISCpComplex instruction set computer(CISC):复杂指令集计算机n多种类型的指令n变长型指令n程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。n优点是控制简单,但计算器各部分的利用率不高,执行速度慢。pReduced instruction set computer(RISC):精简指令集计算机n种类比较少n管道化的指令n寻址方式也比复杂指令集少 n数据管道是在同一个应用中对象之间快速传送
3、数据的小型统一部件,比信息(message)传输的方式更块6指令集的特点p固定长度与可变长度p寻址模式p操作数的个数p操作数的类型p成功的体系结构应用广泛。n时钟速度可变;n不同的总线宽度;n不同的缓存规模7ARM 版本pARM结构被扩展成为多个版本。p本课将集中在ARM7pARM7是von Neumann结构的pARM9是Harvard结构的。8汇编语言p汇编语言指令与翻译成的机器语言指令之间基本是一一对应的关系p基本特点:n一个指令一行;n给内存单元提供名字的标记LABEL,由第一列开始。n指令通常在随后的列开始。n注释以分号开头,分号右边的内容将被汇编程序忽略注释以分号开头,分号右边的内
4、容将被汇编程序忽略9ARM 汇编语言p相当标准的汇编语言:LDR r0,r8;a commentlabelADD r4,r0,r110ARM 汇编语言例子label1ADR r4,cLDR r0,r4;a commentADR r4,dLDR r1,r4SUB r0,r0,r1;comment11r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15(PC)CPSR310N Z C VARM编程器模型p16个通用寄存器,包括PCp一个状态寄存器Current.Program Status Register 12字节的排列顺序pARM允许32位长地址,但每个地址访问是一个字
5、节而不是一个字。byte 3 byte 2 byte 1 byte 0byte 0 byte 1 byte 2 byte 3位31位0低序高序word 4word 0word 4word 0位31位013ARM 数据类型p32位字长p分成四个8位的字节pARM地址可是32位长。p地址是以字节来引用的。p可在加电时设置高序或低序。14ARM 状态位p第个算术、逻辑或位移运算都会调整CPSR位:nN(negative),Z(zero),C(carry),V(overflow).p例如:n-1=0 xffffffff n1 =0 x1 n-1+1=0:NZCV=0110.n0 1 =-1:0 x0
6、0 x1=0 xffffffff NZCV=1000n231-1+1=-231:0 x80000000+0fffffff 0 x7fffffff+0 x1=0 x80000000 NZCV=1001.15ARM 数据指令p基本形式:ADD r0,r1,r2n把 r1+r2的值存储在r0中p立即操作数:ADD r0,r1,#2n将 r1+2的值存储在r0中。16ARM数据指令pADD,ADC:add(w.carry)pSUB,SBC:subtract(w.carry)pRSB,RSC:reverse subtract(w.carry)pMUL,MLA:multiply(and accumulat
7、e)pAND,ORR,EORpBIC:bit clearpLSL,LSR:logical shift left/rightpASL,ASR:arithmetic shift left/rightpROR:rotate rightpRRX:rotate right extended with C17数据操作的不同方法p逻辑位移:n补“0”p算术位移:n在右移时以符号位来充填。pRRX 执行的是33位的循环,包括来自在符号位上的CPSR的C位。18ARM 比较指令pCMP:比较pCMN:负数比较pTST:按位测试(与)nTST R0,#0X0f;判断R0的低4位是否为0pTEQ:按位求反测试(异或
8、)nTEQ R0,R1;比R0,R1是否相等p这些操作的结果只是去更新CPSR中的NZCV位。19ARM 数据传送指令pMOV,MVN:数据非传送MOV r0,r1;将将r1的内容放入的内容放入r0 MVN R1,#0 xFF;R=0 xFFFFF0020ARM 存储器访问指令pLDR,LDRH,LDRB:load(half-word,byte)pSTR,STRH,STRB:store(half-word,byte)p寻址模式:n寄存器间接寻址:LDR r0,r1n有第二个寄存器:LDR r0,r1,-r2n带常数的:LDR r0,r1,#4p存储器指令不直接访问主存储器地址。n通常由PC计算
9、后给出一个地址。nADR伪操作产生一个要求计算地址的指令:ADR r1,FOO21例:C 的赋值语句pC:x=(a+b)-c;p汇编语言:ADR r4,a;get address for aLDR r0,r4;get value of aADR r4,b;get address for b,reusing r4LDR r1,r4;get value of bADD r3,r0,r1;compute a+bADR r4,c;get address for cLDR r2,r4;get value of cSUB r3,r3,r2;complete computation of xADR r4,x
10、;get address for xSTR r3r4;store value of x22例:C 的赋值语句pC:y=a*(b+c);p汇编语言:ADR r4,b;get address for bLDR r0,r4;get value of bADR r4,c;get address for cLDR r1,r4;get value of cADD r2,r0,r1;compute partial resultADR r4,a;get address for aLDR r0,r4;get value of aMUL r2,r2,r0;compute final value for yADR
11、r4,y;get address for ySTR r2,r4;store y23例:C 的赋值语句pC:z=(a R1 SUB R0,R1,R2;R1-R2-R0立即寻址立即寻址 SUBS R0,R0,#1 ;R0 1-R0 MOV R0,#0 xff00 ;0 xff00-R0寄存器间接寻址寄存器间接寻址 LDR R1,R2;将R2 中的数值作为地址,取出此地址中的数 据保存在R1 中。SWP R1,R1,R2;将如中的数值作为地址,取出此地址中的 数值与R1 中的值交换25多种寻址方式p基址加偏移量寻址(基址寻址)LDR r0,r1,#16n将存储在地址r1+16单元的值装入r0p自动变
12、址寻址:LDR r0,r1,#16!n将16与r1的值相加,然后把这个值作为地址。p后变址寻址LDR r0,r1,#16n将r1给定地址的存储单元中的值装入r0,然后把r1的值加16并将新值赋给r1.26ARM 控制流pB指令(Branch operation)B#100n在PC的值上加400n任何分支指令都可有条件地执行。是ARM中改变控制流的基本机制。分支的目的地址称为分支目标。分支是与程序计数器相关的,分支指明了从当前程序计数器到分支目标的偏移量,这个偏移量的单位是字。由于ARM是对字节定址的,所以要把偏移量乘4。2728例:if 语句在ARM中的实现pC:if(a b)x=5;y=c+
13、d;else x=c-d;p汇编:;compute and test conditionADR r4,a;get address for aLDR r0,r4;get value of aADR r4,b;get address for bLDR r1,r4;get value for bCMP r0,r1;compare a=b,branch to false block;true blockMOV r0,#5;generate value for xADR r4,x;get address for xSTR r0,r4;store xADR r4,c;get address for c29
14、If 语句LDR r0,r4;get value of cADR r4,d;get address for dLDR r1,r4;get value of dADD r0,r0,r1;compute yADR r4,y;get address for ySTR r0,r4;store yB after;branch around false block;false blockfblock ADR r4,c;get address for cLDR r0,r4;get value of cADR r4,d;get address for dLDR r1,r4;get value for dSUB
15、 r0,r0,r1;compute c-dADR r4,x;get address for xSTR r0,r4;store value of xafter.30例:条件执行p使用判断来控制执行那条指令:;true block,条件代码由条件代码由CMP更新更新;no need for“BGE fblock”and“B after”MOVLT r0,#5;generate value for xADRLT r4,x;get address for xSTRLT r0,r4;store xADRLT r4,c;get address for cLDRLT r0,r4;get value of c
16、ADRLT r4,d;get address for dLDRLT r1,r4;get value of dADDLT r0,r0,r1;compute yADRLT r4,y;get address for ySTRLT r0,r4;store y31例:条件执行;false blockADRGE r4,c;get address for cLDRGE r0,r4;get value of cADRGE r4,d;get address for dLDRGE r1,r4;get value for dSUBGE r0,r0,r1;compute a-bADRGE r4,x;get addre
17、ss for xSTRGE r0,r4;store value of xp条件执行相对于较少的条件是最好的。32例:用于多分支选择的switch语句 pC:switch(test)case 0:break;case 1:break;p汇编:ADR r2,test;get address for testLDR r0,r2;load value for testADR r1,switchtab;load address for switch tableLDR r15,r1,r0,LSL#2;index switch tableswitchtab DCD case0 DCD case1.pLDR:
18、n把r0移2位把偏移量转换成为字节地址n把存储器r1+r0的值装入的值装入PC r15中33例:FIR 滤波器pC(FIR)滤波器:for(i=0,f=0;iN;i+)f=f+ci*xi;/*xi:周期性的采样周期性的采样*/p汇编语言;循环初始代码循环初始代码MOV r0,#0;use r0 for IMOV r8,#0;use separate index for arraysADR r2,N;get address for NLDR r1,r2;get value of NMOV r2,#0;use r2 for fADR r3,c;load r3 with base of cADR r
19、5,x;load r5 with base of x34例:FIR 滤波器;循环代码循环代码loop LDR r4,r3,r8;get ciLDR r6,r5,r8;get xiMUL r4,r4,r6;compute ci*xiADD r2,r2,r4;add into running sumADD r8,r8,#4;add 1 word offset to array indexADD r0,r0,#1;add 1 to iCMP r0,r1;exit?BLT loop;if i N,continue35ARM 子程序的链接p分支和链接指令:BL foon把当前的PC值存入 r14.p从一
20、个子程序返回:MOV r15,r1436嵌套的子程序调用p嵌套/递归pC:void f1(int a)f2(a);p汇编语言:f1LDR r0,r13;load arg into r0 from stack;r13 is stack pointer ;call f2()STR r13!,r14;store f1s return adrsSTR r13!,r0;store arg to f2 on stackBL f2;branch and link to f2;return from f1()SUB r13,#4;pop f2s arg off stackLDR r13!,r15;restor
21、e reg and return37nSHARC 编程模型nSHARC 汇编语言nSHARC 存储器的组织nSHARC 数据操作nSHARC 控制流程SHARC处理器38SHARC编程模型p寄存器文件:nR0-R15(对浮点运算的名称为F0-F15)n所有的这些寄存器都是40位长n支持单精度浮点格式、32 位定点格式和提高精度的40 位扩展格式p状态寄存器nASTAT:算术状态。(记录ALU,移位器和乘法器状态)nSTKY:sticky.(是状态寄存器中某些们的粘性值,需要指令才能清除)nMODE 1:mode 1.控制定点运算的饱和算术操作和浮点运算的舍入模式p循环寄存器。p数据地址生成寄存
22、器。p中断寄存器。39SHARC 汇编语言p算术符号由分号结束,注释由感叹号开始:R1=DM(M0,I0),R2=PM(M8,I8);!commentlabel:R3=R1+R2;数据存储器的存取程序存储器的存取40SHARC 数据类型p32位IEEE单精度浮点。p40位IEEE扩展精度浮点。p32位整型。p存储器内部是用32位地址的32位字长进行组织。p一条指令为48位。pALU支持饱和算术运算。(ALUSAT位为MODE1)41SHARC 结构p修改的哈佛结构n程序存储存储器可以用来存放一些数据。p寄存器文件联接到:n乘法器n移位器nALU4243乘法器p定点运算可累计到MR(modify
23、 register)寄存器或被写入寄存器文件。定点的结果为80位。p浮点的结果总是送到寄存器文件中。p状态位:负、下溢、上溢、无效、定点、浮点下溢、浮点无效。44ALU/移位器状态标记pALU:n零AZ、溢出AV、负AN、定点进位AC、输入符号、浮点无效AI、最新运行为浮点运算、比较累加寄存器、浮点下溢/上溢、定点溢出、浮点无效等。p移位器n零SZ、溢出SV、符号SS45标记操作p所有的ALU操作都要设置 ASTAT中的 AZ(zero),AN(negative),AV(overflow),AC(fixed-point carry),AI(floating-point invalid)位。pS
24、TKY是算术逻辑单元中的某些位的粘性版本。46例:数据操作p定点-1+1=0:nAZ=1,AU=0(浮点下溢),AN=0,AV=0,AC=1,AI=0.nSTKY的AOS位(fixed point underflow)未设置。p定点-2*3:nMN=1,MV=0,MU=1,MI=0.n4个STKY位都没有设置:MOS(mult.fixed-point overflow),MVS(floating-point overflow),MUS(mult.floating point underflow),MIS(mult.floating-point invalid operation)p 0 x7f
25、ffffff左移3位:SZ=0,SV=1,SS=0.47乘法计算p可进行某些并行的计算:n加减二重计算;n定点乘/累加与加、减、计算平均值;n浮点乘与ALU操作;n乘与加减二重计算。p乘法器的操作数从R0-R7,ALU的操作数从R8-R15.48SHARC 存取p存取结构:无直接存储器操作。p两个数据地址生成器(DAGs):n程序存储器n数据存储器p必须设置 DAG 寄存器来控制存取操作。49DAG1 寄存器I0I1I2I3I4I5I6I7M0M1M2M3M4M5M6M7L0L1L2L3L4L5L6L7B0B1B2B3B4B5B6B7每个每个DAG有四种寄存器:有四种寄存器:Index(I),
26、Modify(M),Base(B)Length(L)50数据地址生成器DAGp提供索引,余数、位反转变址寻址 pMODE1的位决定是主寄存器还是备用寄存器工作。51基本的寻址方式p立即值:R0=DM(0 x20000000);p直接装入:R0=DM(_a);!Loads contents of _a !_a是变量是变量a的地址的地址p直接存储:DM(_a)=R0;!Stores R0 at _a52具有更新的后修改模式pI 寄存器指定基址。pM 寄存器:直接保存变址数。R0=DM(I3,M3)!LoadDM(I2,1)=R1!StorenI 寄存器被变址数更新p基址加偏移量:R0=DM(M1,
27、I0)!Load from M1+I0p循环缓冲:I 指针和存储。M 为前移地址的增量值。L循环缓冲器的数量。M循环缓冲器的基址5354程序存储器中的数据p数据可以被存储在程序存储器中,每个周期可读两次:F0=DM(M0,I0),F1=PM(M8,I9);p编译器可以使程序员控制存储到那个存储器。55例:C赋值pC:x=(a+b)-c;p汇编:R0=DM(_a);!Load aR1=DM(_b);!Load bR3=R0+R1;R2=DM(_c);!Load cR3=R3-R2;DM(_x)=R3;!Store result in x56例:C赋值pC:y=a*(b+c);p汇编:R1=DM(
28、_b);!Load bR2=DM(_c);!Load cR2=R1+R2;R0=DM(_a);!Load aR2=R2*R0;DM(_y)=R2;!Store result in y57例:C赋值p可用指针来缩短代码的长度:!Load b,cR2=DM(I1,M5),R1=PM(I8,M13);R0=R2+R1,R12=DM(I0,M5);R6=R12*R0(SSI);DM(I0,M5)=R8;!Store in y58例:C赋值pC:z=(a b)x=5;y=c+d;else x=c-d;p汇编:!TestR0=DM(_a);R1=DM(_b);COMP(R1,R0);!CompareIF
29、GE JUMP fblock;64C中的 if语句!True blocktblock:R0=5;!Get value for xDM(_x)=R0;R0=DM(_c);R1=DM(_d);R1=R0+R1;DM(_y)=R1;JUMP other;!Skip false block!False blockfblock:R0=DM(_c);R1=DM(_d);R1=R0-R1;DM(_x)=R1;other:!Code after if65特别的if语句的实现pC:if(ab)y=c-d;else y=c+d;p用并行机制来提高速度-计算两种情况,然后选一个保存。66特别的if语句的实现!Loa
30、d valuesR1=DM(_a);R8=DM(_b);R2=DM(_c);R4=DM(_d);!Compute both sum and differenceR12=r2+r4,r0=r2-r4;!Choose which one to savecomp(r8,r1);if ge r0=r12;dm(_y)=r0!Write to y67DO UNTIL 循环DO UNTIL 指令提供有效的循环:LCNTR=30,DO label UNTIL LCE;R0=DM(I0,M0),F2=PM(I8,M8);R1=R0-R15;label:F4=F2+F3;循环长度循环中的最后一条指令终止条件68
31、例:FIR滤波器pC:for(i=0,f=0;iN;i+)f=f+ci*xi;!setupI0=_a;I8=_b;!a0(DAG1),b0(DAG2)M0=1;M8=1!Set up increments!Loop bodyLCNTR=N,DO loopend UNTIL LCE;!Use postincrement modeR1=DM(I0,M0),R2=PM(I8,M8);R8=R1*R2;loopend:R12=R12+R8;69优化FIR滤波器代码I4=_a;I12=_b;R4=R4 xor R4,R1=DM(I4,M6),R2=PM(I12,M14);MR0F=R4,MODIFY(I
32、7,M7);!Start loopLCNTR=20,DO(PC,loop)UNTIL LCE;loop:MR0F=MR0F+R2*R1(SSI),R1=DM(I4,M6),R2=PM(I12,M14);!Loop cleanupR0=MR0F;70SHARC 子程序调用p作用CALL 指令:CALL foo;p绝对地址寻址,间接寻址,相对PC寻址模式。p使用RTS返回指令。71PC堆栈pPC栈:30区X24条指令。p子程序的返回,中断业务程序,循环保存在PC栈内。72例:C函数pC:void f1(int a)f2(a);pAssembler:f1:R0=DM(I1,-1);!Load arg into R0DM(I1,M1)=R0;!Push f2s argCALL f2;MODIFY(I1,-1);!Pop elementRTS;73