书接上回,这相当于是实验1.1的进阶版本。
资料:
链接:https://pan.baidu.com/s/16Oc3hAC8lm7CUjsVnmDscA
提取码:8888
实验项目一
项目名称
实验1.2 原型机II-扩充指令集
实验目的
(1) 理解指令集结构及其作用;
(2) 理解计算机的运行过程,对指令集进行修改;
实验资源
(1) 阅读教材,掌握冯诺伊曼体系的相关内容;
(2) 学习《最小系统与原型机I》内容,完成实验1.1
(3)Ubuntu 20.4.3 64位虚拟机
2 实验任务
2.1 实验任务A
任务名称:添加乘法函数
(按照实验指导书内容操作即可)
进入相应目录:
(1) 使用nanocpu.c或gedit cpu.c来打开cpu.c文件(这里我使用的是vimcpu.c);
(2) cpu.c是原型机的核心模块,其中
1)前面的变量申明,例如machine_info,memory,R0,R1,R2,R3等均为原型机的硬件配置信息,因为其在另外一个文件中已经定义,因此采用extern方式引入;
2)然后是各种操作的具体执行过程,例如对于加法操作,其参数为
源寄存器:source[]
目的寄存器:dest[]
操作标志:*result(-1表示出错)
3)最后的一个函数ExecuteInstruction即为CPU的指令执行过程,其中红圈处的strncpy即表示从内存中取出一条指令(每条指令为字符串型,占20个字节),然后用split函数来对指令进行分割,再根据分割后的结果进行判断指令类型,调用前面的各种函数来进行操作。
(3) 在原型机I的基础上,我们对指令集进行扩充,增加一条乘法指令,其格式为 9 Ra Rb,即将寄存器Ra的值与寄存器Rb的值相乘,结果放在Rb寄存器中,因此需要增加一个ExecuteMul函数。
void ExecuteMul(charsource[],char dest[],int *result)
{
char op;
if(0==strcmp(source,"R0"))op=R0;
else if(0==strcmp(source,"R1"))op=R1;
else if(0==strcmp(source,"R2"))op=R2;
else if(0==strcmp(source,"R3"))op=R3;
else *result=-1;
if(0==strcmp(dest,"R0\n"))R0*=op;
else if(0==strcmp(dest,"R1\n"))R1*=op;
else if(0==strcmp(dest,"R2\n"))R2*=op;
else if(0==strcmp(dest,"R3\n"))R3*=op;
else *result=-1;
}
(4) 在ExecuteInstruction增加一个判断分支,从而能够识别此条指令。
case '9':
split(instruction_buffer,"",revbuf,&num);
ExecuteMul(revbuf[1],revbuf[2],result);

该实验介绍了如何在原型机II基础上扩展指令集以实现乘法和除法操作。实验任务包括添加乘法指令、使用加法实现乘法以及设计除法算法。乘法通过ExecuteMul函数实现,除法则通过转换为减法和计数实现。文章还讨论了如何在不支持乘法和除法的计算机上使用泰勒级数近似计算三角函数和对数函数。此外,文章对比了硬件扩展和使用已有指令的优缺点,关联了RISC和CISC架构的特点。
最低0.47元/天 解锁文章
1179

被折叠的 条评论
为什么被折叠?



