学习笔记:计算机组成原理Ch3.时序计算机的指令和地址
本章主要围绕两个主线:
如何突破冯诺依曼瓶颈(Vom Neumann Bottleneck)?
如何实现高级程序语言(HLL)?
先来看一下冯诺依曼瓶颈,在之前定义过冯诺依曼架构,会发现,存储器到处理器之间需要通道连接,那么连接的通道就是限制计算机性能的瓶颈,下面介绍几种突破的方法:
Program Counter:

在处理单元设置寄存器(register),P register中存储一系列连续的地址,而I register中存储instruction,这样每一次运算,instruction format 中的next就可以省略。
值得注意的是,control unit中还会留有一个next指令:

因为control指令的任务就是改变指令的顺序,所以需要next指令
using Stack:
如下图所示

stack处理时,同时吞入stack上方的两个元素,处理完,吐出一个res放在上方,
这样在instruction format里就可以只留下操作指令,其余都可以省略。
在介绍栈命令时,可以先来看看一个操作的原理,:reverse polish notation
我愿意把他比作日语、韩语,之前的操作是主谓宾,现在变成主宾谓:
1+1 ——-》 1 1 +
这样就能非常好的适应上面介绍的栈运算。
问题就回来了,栈运算真的能突破瓶颈吗?

如上图所示的例子,栈运算虽然不需要任何地址,但是操作数会远远大于普通的运算,所以有时候弊大于利。
using register for intermediate result:
和之前的P register相似,在cpu和memory之间设置一个register,当我们操作的量1恰好也可以作为输出量时,就可以将另外一个量存储在register中,就减少一个需要传递的信息。

前面介绍的都是在信息处理指令的容量缩小,下面介绍如何缩小控制指令:
可以把指令合并,如下图所示:

当然,我们也可以合并指令,让一个指令可以干很多事情:
Vector Instruction:
还记得for、while循环吗,在其中会设置一个counter,用于看是否到达了最终需要的结果,也可以在指令里设置一个counter:

现在来看,该如何支持高级程序语言(HLL):
如何返回值(return)?
使用stack,在data memory里设置一个stack,每次操作完,把值压上去,最后执行到返回操作时,返回stack最上面的值。

如何定位(addressing)?
分为直接定位、间接定位(indirect addressing)、relative addressing
直接定位:直接定位memory里的地址。
间接定位:先定位地址的地址,再转接到地址。更常见的是在register里得到地址的地址,然后在memory里定位地址。
relative addressing:想象这是一个数组,有index和base,其实先定位的是base基准数,然后index是在地址中的offset(偏移量),这样是不是就能理解数组是从0开始的了。
在高级语言里还会出现block:
这些block通常都有层次,实际上在memory中是运用static link和dynamic link连接而成的。

下面来解释如何实现function:
function和macros的区别在第一章已经介绍过了,这里不赘述。
在function里如何传递参数:
两种办法:
值传递:对原来的值取copy,非常好理解
引用传递:calling program提供这个值的地址,在地址上操作。
在function中如何return?
存在一个stack如上文介绍的那样,直接取出最上面的值。