一道小题
题目内容
在本讲中,我们讲了 RISC 计算机的基本思想。事实上,人们可以设计出只有一条指令的计算机,这种计算机称为单指令计算机 (Single Instruction Computer,SIC) 。因为只有一条指令,指令集不能再精简,所以这种计算机也称为终极精简指令集计算机 (Ultra Reduced Instruction Set Computer,URISC) 。
这条唯一的指令有三个操作数,每个操作数均为一个存储单元地址,指令的功能是对前两个存储单元中的操作数做减法,将结果写入 第二个操作数 所指的存储单元中。如果减法的结果小于 0,则发生跳转,执行第三个操作数所指向的存储单元中的指令,否则;继续执行后继指令。
因为只有一条指令,所以不需要操作码,因此该指令的格式如下:
1 | [L:] a, b, c ; mem[b] = mem[b] - mem[a],if (mem[b] < 0) goto c |
其中,L 为可选的标号,“;” 后面是注释,此处实际上是对该指令功能的形式化描述。
尽管 URISC 只有一条指令,但是它是一种通用计算机,也就是说用这一条指令可以编写出实现任何复杂算法的程序。
例如,将地址为 SRC 的存储单元中的内容传送到地址为 DEST 的存储单元中。可以编写出如下程序:
1 | START: DEST, DEST, ADD |
其中,WORD 是伪指令,用于将指定的内存单元初始化为指定的常数。
根据以上说明,完成如下题目:
编写一段 URISC 程序,将 a 和 b 相加,结果写入 a 中,b 保持不变。
编写一段 URISC 程序,将 a 和 b 相乘,结果写入 c 中。约定存储单元 one 包含常数 1,a 和 b 均大于 0,并且 a 和 b 可以被程序修改。
请提出一个设计方案,用硬件实现 URISC 计算机。你只需提出顶层设计,可以不考虑电路细节。
(选做)编写一个 C/C++ 程序,对 URISC 的功能进行仿真。
作答思路
这道题主要考察的还是一种数学上的思维,并不考察具体的计算机技术(让人莫名想到皮亚诺公理)
由于本人对硬件不太了解所以做做 1,2,4 问,这篇先写一二问(第四个以后填坑)
第一问的内容思路很清晰,从题目叙述就能知道,这个所谓的 ultra 指令集只支持减法,但是支持负数的存储(应该是补码形式)那么我们只要构建相应的减去负数即可了。
第二问的就是在加法的基础上构建出乘法,思路是一样的。(构建循环)
第一问
1 | START: TEMP, TEMP, L1 ; TEMP = 0 |
第二问
1 | START: c, c, T1 ; c = 0 |
写的好丑