计组笔记:第五章-指令系统

xeonds

2023-06-17 20:07:32

指令是硬件和软件的中间层。指令系统的设计主要包括指令功能指令格式的设计。它的评价指标有四点:完备(不能缺少功能)、高效(省地方一点)、规整(格式简单一点)、兼容性(向后兼容,无成本迁移)四方面。

指令的基本格式

主要是两部分,首先是操作码,其次是数个地址(0个或多个)。将二进制编码用助记符表示,就是汇编语言。

计算机的存储方式有大端存储(从数据的高字节开始存)、小端存储(从数据的低字节开始存)

此外还有边界对齐的概念。如图所示:

还有一种存储模式,堆栈。这里的堆栈应该就是栈,堆和栈是俩不一样的东西,堆是存程序malloc的内存的,栈是存程序函数调用开销的,这俩在程序的内存中存储的位置也不一样。

存储模式也有两类:冯诺依曼结构(程序和数据等价)、哈佛结构(程序和数据不对等)。后者对于流水线结构有优化,能达到流水线的理想性能。现在的芯片内部Cache有的会使用哈佛结构:数据Cache、指令Cache,而外部使用冯诺依曼结构。

指令的典型分类

寻址方式:指令获取操作数的方式

例如,x86处理器的条件转移指令就是一种PC相对寻址。

无关位置的程序实现:

上面两种方案的缺点是位数多,占用指令存储空间大。

指令长度设计

操作码格式分为定长、变长操作码,变长操作码为了防止重复指令,得用赫夫曼编码来编制操作码。

  1. 定长操作码

对于定长操作码,可以将指令从高频到低频排序,依次给从0开始编号。

  1. 变长操作码

对于变长操作码,按照频率高到低排序,再构造霍夫曼树作为编码结果。

变长操作码设计原则: - 若指令字长度固定,则长地址码对应短操作码,操作码长度随地址码长度缩短而增加 - 如果指令字长度可变,则以指令使用频率为设计依据,高频短码,低频长码 - 设计总是从短码开始,并且保证现在的操作码和以后扩展的编码能区分 - 短码不能是长码的前缀

根据赫夫曼编码的合并方式不同,得到的结果可能不唯一,但是平均码长一定是唯一的

缺点:编码长度种类过多,电路设计困难

  1. 扩展操作码

是将赫夫曼编码的码长变为更少的种类。

可以看到,它编码种类较少的同时,码长也很接近赫夫曼编码。因此实际设计时,一般使用这种设计方式。比如CISC的x86就可以这么设计。

上面是两种设计方式。一个长度的指令码必须保留一种组合给更长的指令码做前缀。

因此,上面的操作码可以设计如下:

对于上面的问题,相当于计算单地址指令一共有多少个。我们分析如下:

由上图的不等式能解出来,B类指令最多一共有254条。

上题还是从短码开始考虑。首先短码有m条,则剩下的前缀有\(2^4-m\)个。再乘以长码扩展的长度\(2^6\),就能得到长码最多的个数。

5.6.典型指令系统

Intel x86

发展:从诞生时的80条指令增长到2015的3600条指令(来源Intel博客)。

十分复杂,指令集手册5000多页(

目前在向着RISC的方向均衡。它十分适合高性能计算。

MIPS

ARM手册也长,8000多页(

32位MIPS

64位MIPS,14种指令格式

MIPS是arm流行之前,最流行的处理器。

这一章基本就是这样了。