学习笔记:计算机组成原理Ch3.时序计算机的指令和地址

本章主要围绕两个主线:

如何突破冯诺依曼瓶颈(Vom Neumann Bottleneck)?

如何实现高级程序语言(HLL)?

先来看一下冯诺依曼瓶颈,在之前定义过冯诺依曼架构,会发现,存储器到处理器之间需要通道连接,那么连接的通道就是限制计算机性能的瓶颈,下面介绍几种突破的方法:

Program Counter:

044_001.jpg

在处理单元设置寄存器(register),P register中存储一系列连续的地址,而I register中存储instruction,这样每一次运算,instruction format 中的next就可以省略。

值得注意的是,control unit中还会留有一个next指令:

044_002.jpg

因为control指令的任务就是改变指令的顺序,所以需要next指令

using Stack:

如下图所示

044_003.jpg

stack处理时,同时吞入stack上方的两个元素,处理完,吐出一个res放在上方,

这样在instruction format里就可以只留下操作指令,其余都可以省略。

在介绍栈命令时,可以先来看看一个操作的原理,:reverse polish notation

什么是逆波兰表达式 ?

我愿意把他比作日语、韩语,之前的操作是主谓宾,现在变成主宾谓:

1+1 ——-》 1 1 +

这样就能非常好的适应上面介绍的栈运算。

问题就回来了,栈运算真的能突破瓶颈吗?

044_004.jpg

如上图所示的例子,栈运算虽然不需要任何地址,但是操作数会远远大于普通的运算,所以有时候弊大于利。

using register for intermediate result:

和之前的P register相似,在cpu和memory之间设置一个register,当我们操作的量1恰好也可以作为输出量时,就可以将另外一个量存储在register中,就减少一个需要传递的信息。

044_005.jpg

前面介绍的都是在信息处理指令的容量缩小,下面介绍如何缩小控制指令:

可以把指令合并,如下图所示:

044_006.jpg

当然,我们也可以合并指令,让一个指令可以干很多事情:

Vector Instruction:

还记得for、while循环吗,在其中会设置一个counter,用于看是否到达了最终需要的结果,也可以在指令里设置一个counter:

044_007.jpg

现在来看,该如何支持高级程序语言(HLL):

如何返回值(return)?

使用stack,在data memory里设置一个stack,每次操作完,把值压上去,最后执行到返回操作时,返回stack最上面的值。

044_008.jpg

如何定位(addressing)?

分为直接定位、间接定位(indirect addressing)、relative addressing

直接定位:直接定位memory里的地址。

间接定位:先定位地址的地址,再转接到地址。更常见的是在register里得到地址的地址,然后在memory里定位地址。

relative addressing:想象这是一个数组,有index和base,其实先定位的是base基准数,然后index是在地址中的offset(偏移量),这样是不是就能理解数组是从0开始的了。

在高级语言里还会出现block:

这些block通常都有层次,实际上在memory中是运用static link和dynamic link连接而成的。

044_009.jpg

下面来解释如何实现function:

function和macros的区别在第一章已经介绍过了,这里不赘述。

在function里如何传递参数:

两种办法:

值传递:对原来的值取copy,非常好理解

引用传递:calling program提供这个值的地址,在地址上操作。

在function中如何return?

存在一个stack如上文介绍的那样,直接取出最上面的值。


学习笔记:计算机组成原理Ch3.时序计算机的指令和地址
https://yiyuwang.be/2021/01/07/2021-01-07-342521536/
作者
StevenWong
发布于
2021年1月7日
许可协议