一道小题
题目内容
在本讲中,我们讲了 RISC 计算机的基本思想。事实上,人们可以设计出只有一条指令的计算机,这种计算机称为单指令计算机 (Single Instruction Computer,SIC) 。因为只有一条指令,指令集不能再精简,所以这种计算机也称为终极精简指令集计算机 (Ultra Reduced Instruction Set Computer,URISC) 。 这条唯一的指令有三个操作数,每个操作数均为一个存储单元地址,指令的功能是对前两个存储单元中的操作数做减法,将结果写入 第二个操作数 所指的存储单元中。如果减法的结果小于 0,则发生跳转,执行第三个操作数所指向的存储单元中的指令,否则;继续执行后继指令。 因为只有一条指令,所以不需要操作码,因此该指令的格式如下:
[L:] a, b, c ; mem[b] = mem[b] - mem[a],if (mem[b] < 0) goto c
其中,L 为可选的标号,“;” 后面是注释,此处实际上是对该指令功能的形式化描述。 尽管 URISC 只有一条指令,但是它是一种通用计算机,也就是说用这一条指令可以编写出实现任何复杂算法的程序。 例如,将地址为 SRC 的存储单元中的内容传送到地址为 DEST 的存储单元中。可以编写出如下程序:
START: DEST, DEST, ADD
ADD : SRC, TEMP, NEXT
NEXT: TEMP, DEST, CONT
CONT: …
…
TEMP: WORD 0
其中,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 指令集只支持减法,但是支持负数的存储(应该是补码形式)那么我们只要构建相应的减去负数即可了。
第二问的就是在加法的基础上构建出乘法,思路是一样的。(构建循环)
第一问
START: TEMP, TEMP, L1 ; TEMP = 0
L1: b, TEMP, L2 ; TEMP = -b
L2: TEMP, a, END ; a = a - TEMP
END
第二问
START: c, c, T1 ; c = 0
T1: pone, pone, T2 ; pone = 0
T2: one, pone, S1 ; pone = -1
S1: b1, b1, S2 ; b1 = 0
s2: b, b1, L1 ; b1 = -b
L1: TEMP, TEMP, L2 ; TEMP = 0
L2: a, TEMP, LOOP ; TEMP = -a
LOOP: TEMP, c, j ; c -= TEMP
j: pone, b1, LOOP ; jump
END
写的好丑