计算机系统实验1.2-原型机II-扩充指令集

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

书接上回,这相当于是实验1.1的进阶版本。

资料:

链接:https://pan.baidu.com/s/16Oc3hAC8lm7CUjsVnmDscA

提取码:8888

  1. 实验项目一

  1. 项目名称

实验1.2 原型机II-扩充指令集

  1. 实验目的

(1) 理解指令集结构及其作用;

(2) 理解计算机的运行过程,对指令集进行修改;

  1. 实验资源

(1) 阅读教材,掌握冯诺伊曼体系的相关内容;

(2) 学习《最小系统与原型机I》内容,完成实验1.1

(3)Ubuntu 20.4.3 64位虚拟机

  1. 2 实验任务

  1. 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值