2023-06-17 20:07:32
指令是硬件和软件的中间层。指令系统的设计主要包括指令功能和指令格式的设计。它的评价指标有四点:完备(不能缺少功能)、高效(省地方一点)、规整(格式简单一点)、兼容性(向后兼容,无成本迁移)四方面。
主要是两部分,首先是操作码,其次是数个地址(0个或多个)。将二进制编码用助记符表示,就是汇编语言。
计算机的存储方式有大端存储(从数据的高字节开始存)、小端存储(从数据的低字节开始存)
此外还有边界对齐的概念。如图所示:
还有一种存储模式,堆栈。这里的堆栈应该就是栈,堆和栈是俩不一样的东西,堆是存程序malloc的内存的,栈是存程序函数调用开销的,这俩在程序的内存中存储的位置也不一样。
存储模式也有两类:冯诺依曼结构(程序和数据等价)、哈佛结构(程序和数据不对等)。后者对于流水线结构有优化,能达到流水线的理想性能。现在的芯片内部Cache有的会使用哈佛结构:数据Cache、指令Cache,而外部使用冯诺依曼结构。
MUL BL
,事先规定好了地址在哪例如,x86处理器的条件转移指令就是一种PC相对寻址。
无关位置的程序实现:
上面两种方案的缺点是位数多,占用指令存储空间大。
操作码格式分为定长、变长操作码,变长操作码为了防止重复指令,得用赫夫曼编码来编制操作码。
对于定长操作码,可以将指令从高频到低频排序,依次给从0开始编号。
对于变长操作码,按照频率高到低排序,再构造霍夫曼树作为编码结果。
变长操作码设计原则: - 若指令字长度固定,则长地址码对应短操作码,操作码长度随地址码长度缩短而增加 - 如果指令字长度可变,则以指令使用频率为设计依据,高频短码,低频长码 - 设计总是从短码开始,并且保证现在的操作码和以后扩展的编码能区分 - 短码不能是长码的前缀
根据赫夫曼编码的合并方式不同,得到的结果可能不唯一,但是平均码长一定是唯一的
缺点:编码长度种类过多,电路设计困难
是将赫夫曼编码的码长变为更少的种类。
可以看到,它编码种类较少的同时,码长也很接近赫夫曼编码。因此实际设计时,一般使用这种设计方式。比如CISC的x86就可以这么设计。
上面是两种设计方式。一个长度的指令码必须保留一种组合给更长的指令码做前缀。
因此,上面的操作码可以设计如下:
对于上面的问题,相当于计算单地址指令一共有多少个。我们分析如下:
由上图的不等式能解出来,B类指令最多一共有254条。
上题还是从短码开始考虑。首先短码有m条,则剩下的前缀有\(2^4-m\)个。再乘以长码扩展的长度\(2^6\),就能得到长码最多的个数。
发展:从诞生时的80条指令增长到2015的3600条指令(来源Intel博客)。
十分复杂,指令集手册5000多页(
目前在向着RISC的方向均衡。它十分适合高性能计算。
ARM手册也长,8000多页(
32位MIPS
64位MIPS,14种指令格式
MIPS是arm流行之前,最流行的处理器。
这一章基本就是这样了。