资源描述:
《计算机组成与结构——cpu课程设计报告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、面向对象程序设计课程设计《CPU设计与仿真》课程设计报告学号:2012班级序号:姓名:指导教师:成绩:dida信息工程学院2012年6月24-24-面向对象程序设计课程设计实习题目一【需求规格说明】一、题目:以下文件:sim.cpp, computer.h, computer.cpp, proj1.cpp and proj1.h 组成了MIPS仿真器的一个框架. 通过在文件proj1.cpp中增加代码来完成整个程序。你的仿真器必须能仿真以下MIPS机器指令: addu Rdest,Rsrc1,Rsrc2 addiu Rdest,Rsrc1,imm
2、subu Rdest,Rsrc1,Rsrc2 sll Rdest,Rsrc,shamt srl Rdest,Rsrc,shamt and Rdest,Rsrc1,Rsrc2 andi Rdest,Rsrc,imm or Rdest,Rsrc1,Rsrc2 ori Rdest,Rsrc,imm lui Rdest,imm slt Rdest,Rsrc1,Rsrc2 beq Rsrc1,Rsrc2,raddr bne
3、 Rsrc1,Rsrc2,raddr j address jal address jr Rsrc lw Rdest,offset(Radd)二、问题描述:题目已经给出程序代码的基本框架,我们只需要在proj1.cpp中实现反汇编函数和指令仿真函数,在两个函数中完成以上指令。我们需要参考opcode和func的值对应表,通过分情况讨论,区分并实现指令。三、问题分析:我们要真正理解并解决问题,我们必须大概看懂现成的代码框架,参考opcode与func和指令的对应表,根据对应数值使用if,else语句和switc
4、h分支实现区分实现指令。【算法设计】(1)设计思想:1、分割指令:使用移位运算的方法实现分割指令,如:opcode=instr>>26;rs=(instr<<6)>>27;2、提取符号位:也是使用移位运算取立即数的最高位,若s=1,则执行“immediate-=65536;”2^16=65536。当最高位为1时,即立即数为负,可是此时立即数由补码转化成十进制数24-24-面向对象程序设计课程设计并不是负数,所以需要执行此立即数减2的16次方得到一个正确的负数。3、反汇编显示转化后指令:使用C语言的表示法sprintf_s(ch,"addu$%d,$%d,$%d",rd,rs,rt);pri
5、ntf(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=instr>>26;rs=(instr<<6)>>27
6、;rt=(instr<<11)>>27;rd=(instr<<16)>>27;shamt=(instr<<21)>>27;funct=(instr<<26)>>26;immediate=(instr<<16)>>16;target_addr=(instr<<6)>>6;2、立即数处理:s=immediate>>15;//s=1,即符号位为1,立即数为负数if(s==1){immediate-=65536;}24-24-面向对象程序设计课程设计3、指令分情况实现,使用do_instruction()包含反汇编函数实现和指令仿真函数内容。利用pc是否为零判断情况//比较指令charch[50]
7、;//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]+mip