您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 计算机组成与结构――CPU课程设计报告
《CPU设计与仿真》课程设计报告学号:2012班级序号:姓名:指导教师:成绩:dida信息工程学院2012年6月面向对象程序设计课程设计-1-1实习题目一【需求规格说明】一、题目:以下文件:sim.cpp,computer.h,computer.cpp,proj1.cppandproj1.h组成了MIPS仿真器的一个框架.通过在文件proj1.cpp中增加代码来完成整个程序。你的仿真器必须能仿真以下MIPS机器指令:adduRdest,Rsrc1,Rsrc2addiuRdest,Rsrc1,immsubuRdest,Rsrc1,Rsrc2sllRdest,Rsrc,shamtsrlRdest,Rsrc,shamtandRdest,Rsrc1,Rsrc2andiRdest,Rsrc,immorRdest,Rsrc1,Rsrc2oriRdest,Rsrc,immluiRdest,immsltRdest,Rsrc1,Rsrc2beqRsrc1,Rsrc2,raddrbneRsrc1,Rsrc2,raddrjaddressjaladdressjrRsrclwRdest,offset(Radd)二、问题描述:题目已经给出程序代码的基本框架,我们只需要在proj1.cpp中实现反汇编函数和指令仿真函数,在两个函数中完成以上指令。我们需要参考opcode和func的值对应表,通过分情况讨论,区分并实现指令。三、问题分析:我们要真正理解并解决问题,我们必须大概看懂现成的代码框架,参考opcode与func和指令的对应表,根据对应数值使用if,else语句和switch分支实现区分实现指令。【算法设计】(1)设计思想:1、分割指令:使用移位运算的方法实现分割指令,如:opcode=instr26;rs=(instr6)27;2、提取符号位:也是使用移位运算取立即数的最高位,若s=1,则执行“immediate-=65536;”2^16=65536。当最高位为1时,即立即数为负,可是此时立即数由补码转化成十进制数面向对象程序设计课程设计-2-2并不是负数,所以需要执行此立即数减2的16次方得到一个正确的负数。3、反汇编显示转化后指令:使用C语言的表示法sprintf_s(ch,addu$%d,$%d,$%d,rd,rs,rt);printf(ch);4、指令仿真实现:一方面是pc的变化,另一方面是寄存器和内存的值变化,另外由*changedReg和*changedMem记录变化情况。若无变化,则赋(-1)值如下:(1)mips-pc=mips-pc+4;(2)mips-registers[rd]=mips-registers[rt]+mips-registers[rs];(3)if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;(2)设计表示:1、分割指令://从底层数据分割指令opcode=instr26;rs=(instr6)27;rt=(instr11)27;rd=(instr16)27;shamt=(instr21)27;funct=(instr26)26;immediate=(instr16)16;target_addr=(instr6)6;2、立即数处理:s=immediate15;//s=1,即符号位为1,立即数为负数if(s==1){immediate-=65536;}面向对象程序设计课程设计-3-33、指令分情况实现,使用do_instruction()包含反汇编函数实现和指令仿真函数内容。利用pc是否为零判断情况//比较指令charch[50];//R格式if(opcode==0){switch(funct){case33://addu//pc!=0-被反汇编函数调用if(pc!=0){sprintf_s(ch,addu$%d,$%d,$%d,rd,rs,rt);printf(ch);}//pc=0-被指令仿真函数调用else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]+mips-registers[rs];if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;}break;4、在反汇编函数中调用do_instruction()函数:do_instruction(instr,0,pc);在指令仿真函数中调用do_instruction()函数:do_instruction(instr,mips,0,changedReg,changedMem);面向对象程序设计课程设计-4-4【调试报告】1、R格式的jr指令的实现:需要把寄存器中的地址赋予pc,寄存器和内存均无变化。2、R格式的srl指令:移位运算取shamt段数据进行移位即可。我本来还打算循环乘shamt个2,忘记了简单的移位运算。3、J格式的指令面向对象程序设计课程设计-5-5jump指令的pc由来:NewPC={PC[31..28],targetaddress,00}所以,需要将原pc+4再进行移位运算取pc高四位再与目标地址相加,对于是否需要加4的问题,经过我的思考,觉得需要加四,因为此时传入的pc是上一条指令执行时的pc,即又是控制当前指令的输出的pc(原理:指令执行时的当前pc存储下一条指令的地址)。故需要加四。另外,对C语言的输出的表示法不清楚,刚开始时不知道有次用法。4、I格式的bne:当rs寄存器的值不等于rt寄存器的值时,执行pc+4+立即数*45、I格式的lw指令:面向对象程序设计课程设计-6-6lw从内存中取数据,数据所在地址就是rs寄存器存放的地址相对起始地址的差值【附录】#includestdafx.h#includeproj1.h#includecomputer.husingnamespacestd;//指令处理函数:do_instruction(),合理利用重复代码,在反汇编函数和指令仿真函数中调用voiddo_instruction(unsignedintinstr,Computermips=0,unsignedintpc=0,int*changedReg=0,int*changedMem=0){unsignedintopcode,rs,rt,rd,shamt,funct;intimmediate,target_addr;//符号位ints;//从底层数据分割指令opcode=instr26;rs=(instr6)27;rt=(instr11)27;rd=(instr16)27;shamt=(instr21)27;funct=(instr26)26;immediate=(instr16)16;target_addr=(instr6)6;s=immediate15;//s=1,即符号位为1,立即数为负数if(s==1){/*immediate=(immediate17)17;*///方法1/*immediate=immediate%32768-32768;*///方法2immediate-=65536;//方法3:当立即数首位为1时,即把立即数-2^16}//比较指令charch[50];//R格式if(opcode==0){switch(funct){面向对象程序设计课程设计-7-7case33://addu//pc!=0-被反汇编函数调用if(pc!=0){sprintf_s(ch,addu$%d,$%d,$%d,rd,rs,rt);printf(ch);}//pc=0-被指令仿真函数调用else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]+mips-registers[rs];if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;}break;case35://subuif(pc!=0){sprintf_s(ch,subu$%d,$%d,$%d,rd,rs,rt);printf(ch);}else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]+mips-registers[rs];if(rd==0){*changedReg=-1;}else*changedReg=rd;*changedMem=-1;}break;case36://andif(pc!=0){sprintf_s(ch,and$%d,$%d,$%d,rd,rs,rt);printf(ch);}else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]&mips-registers[rs];面向对象程序设计课程设计-8-8if(rd==0){*changedReg=-1;}else*changedReg=rd;*changedMem=-1;}break;case37://orif(pc!=0){sprintf_s(ch,or$%d,$%d,$%d,rd,rs,rt);printf(ch);}else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]^mips-registers[rs];if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;}break;case42://sltif(pc!=0){sprintf_s(ch,slt$%d,$%d,$%d,rd,rs,rt);printf(ch);}else{mips-pc=mips-pc+4;if(mips-registers[rs]mips-registers[rt]){mips-registers[rd]=1;}elsemips-registers[rd]=0;if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;}面向对象程序设计课程设计-9-9break;case8://jrif(pc!=0){sprintf_s(ch,jr$%d,rs);printf(ch);}else{mips-pc=mips-registers[rs];*changedReg=-1;*changedMem=-1;}break;case0://sllif(pc!=0){sprintf_s(ch,sll$%d,$%d,%d,rd,rt,shamt);printf(ch);}else{//intsll_shamt=1;//for(unsignedinti=0;ishamt;i++)//{//sll_shamt*=2;//}mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]shamt;if(rd==0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;}break;case2://srlif(pc!=0){sprintf_s(ch,srl$%d,$%d,%d,rd,rt,shamt);printf(ch);}else{mips-pc=mips-pc+4;mips-registers[rd]=mips-registers[rt]shamt;面向对象程序设计课程设计-10-10if(rd==0){*changedReg=-1;}else*changedReg=r
本文标题:计算机组成与结构――CPU课程设计报告
链接地址:https://www.777doc.com/doc-4466941 .html