欢迎光临散文网 会员登陆 & 注册

第六章-计算机体系结构

2023-01-12 21:49 作者:开发员阿梦  | 我要投稿

《数字设计和计算机体系结构》是一本自底向上来介绍计算机组成的优秀参考书。配合教材食用更佳。

 

第五章介绍完成基本的数字电路模块以及其Verilog编程实现之后,在第六章开始介绍计算机的体系结构。

 

体系结构

体系结构就是程序员所见到的计算机,由指令集(汇编语言)和操作数地址来定义。

指令集也就是一套汇编语言的标准,汇编语言最终会被汇编为机器代码;

根据指令的不同,操作数可能在寄存器中也可能在存储器中。操作数的地址也就对应着寄存器和存储器。

 

指令集

指令集就是指挥计算机工作的一组指令。本章介绍了一种简单体系结构,MIPS。MIPS计算机属于精简指令集计算机,也就是我常听到的RISC (Reduced Instruction Set Computer)。相对的,一般电脑常用的Intel x86体系结构属于复杂指令集计算机,CISC (Complex Instruction Set Computer)。精简不精简,直观地理解就是,RISC中定义的指令是基本的装载、存储、加减乘除、逻辑运算等,更复杂的操作如“字符串移动”,在处理器中会使用多条基本的指令实现;而x86中可能会专门定义一个指令叫做“字符串移动”来实现此功能。显然,RISC指令集确实精简,但是每个操作对应的指令数量,或者说程序代码被翻译为机器代码后的长度,会很大;CISC虽然定义了很多细化、复杂的指令,开发难度也大,但是其能够使用较少的指令实现复杂的操作。而且在现实使用中由于Intel x86前后兼容性好,虽然有很多冗余的指令,但是x86所占的市场份额还是难以撼动的。

 

汇编语言

指令本质上还是一串0/1串,也就是机器代码。为这种机器代码定义一套语法规则,用人类可读的方式表示出来,这就是汇编语言。

汇编语言由三部分组成:助记符、源操作数(可能多个)、目的操作数。

指令有数个分类,每种分类都有其指令的格式;汇编语言为了便于人类理解,也有其定义的格式;汇编语言中源操作数的顺序可能与指令中的格式不一样。

 

 

操作数

在计算机体系结构中,另一个重要的部分是操作数。操作数有多种存储方式,可以被存储在寄存器、存储器以及指令中。存储在指令中的操作数被称为立即数。在汇编语言中,除了存储在指令中的立即数,对其他立即数的操作多指的是对操作数所在的寄存器和存储器的地址进行操作——也就是先从某个地址的寄存器和存储器将操作数取出。MIPS体系结构中定义的字长为32位或者64位,这里只讨论了32位的情况。存储器的访问速度很慢,所以存储器中取出操作数速度也很慢。执行指令的处理器访问寄存器和立即数的速度很快。

寄存器

在MIPS体系结构中定义了32个寄存器,称为寄存器文件(register file)或者寄存器集(register set)。从寄存器读取操作数的速度快的原因是,寄存器在物理上一般使用小SRAM阵列创建,其使用较小的译码器,较少的位线,连接到较少的存储单元,所以与大的存储器相比,其具有更短的关键路径,时延小[P183]。

这32个寄存器也属于通用寄存器。32个寄存器有多个分类[P184]。

存储器

注意,在MIPS体系结构中,指令是按照字节寻址的。也就是说,在MIPS中,单个地址的长度是一个字节。但是指令的长度为32位,也就是一个MIPS中的一个字长。因此MIPS一条指令的长度为4字节,尤其是对于跳转指令,这个特征十分重要。比如汇编语言中的跳转指令J,其操作数为跳转的地址数,但是跳转的地址是字长对齐的,所以操作数最小值为0x100,也就是最低两位一定为0。

 

指令的分类

要知道几种基本的指令类型,其使用的操作数,其用到了寄存器或是存储器,其指令中的格式:哪几位是源操作数、哪几位是目的操作数;立即数在哪儿、操作谁的值,最后存储在哪儿。这些问题不难搞懂;这些内容直接指导后续对微体系结构的设计。同时注意,计算机中的数都以补码存储。基本方式:正数原码与补码相同;负补码为正值按位取反后加1。负数补码算原值也是将补码按位取反后加1,算出正值,然后加上负号。

R型指令

R就是Register的缩写。顾名思义就是使用寄存器的指令。该类型指令有三个寄存器操作数:两个源操作数      rs,rt;一个目的操作数 rd。

R类型指令对应的汇编语言格式为:

助记符+rd+rs+rt,

操作顺序是rs?rt→rd,?代表MIPS定义的任意二元运算。

32位的指令格式是:

注意,R型指令的opcode都一样,都是6位全0。具体是什么操作由指令中的funct字段决定。

指令举例:

其中add指令执行 s0=s1+s2;

sub指令执行 t0=t3-t5。

 

I型指令

对应汇编语言格式:

助记符+rt+rs+立即数。

I就是immediate的缩写,顾名思义就是用到了指令中立即数的指令。有三个操作数,两个为寄存器,另外一个为指令中的立即数。32位指令格式如下。

没错,这里可以发现,指令格式中的rs与rt顺序和汇编格式中相反。

其中立即数的长度为16位,但是立即数一般会用于和寄存器或者存储器中存储的32位数进行运算,因此MIPS中的指令对立即数进行符号扩展,也就是整数高位补0,负补1。除此外,部分逻辑操作采用0扩展。

指令举例如下:

其中addi干的事儿是:

s0=s1+5;

t0=s3-12

lw,即load word,是将存储器中的一个字的数加载到寄存器中。寄存器$0存储的值永远是0。$0作为存储器地址的基址。$0(rs)中的值加上立即数32,得到要被读取的存储器中数据的地址。然后将存储器中地址32存储的数据读出来,存储到寄存器t2中。

sw,即store word,是lw反操作。寄存器s1中的值存储到存储器地址t1+4中。

 

J型指令

J即 jump的缩写。用于跳转。汇编格式为:

助记符+addr

指令格式为:


有意思的是,MIPS中的地址不是32位么?这里怎么只有26位呢?[P207]

以jal指令为例。jal指令将直接跳转到给出的地址。

 由于J型的跳转的步长是字(4字节),也是条指令的长度。但是MIPS是字节寻址的。因此jal的跳转地址一定是4的倍数,也就是最小为0x100。因此,32位的跳转地址中,最低两位一定是0。还差4位数才能放得下地址,咋办?

MIPS中定义,J型指令跳转地址的高四位,由当前程序计数器(PC)中的地址值+4得到。也就是说,在解析J型指令时,{PC+4, 26位的跳转地址, 00}最终组成32位的跳转地址。

 

以上是书中第六章前三节的内容。紧接着6.4节介绍了高级语言中常见的操作的汇编实现。比如逻辑运算、移位、生成常数、分支语句、循环语句、函数调用等,如何用MIPS定义的汇编语言实现。

6.5节(206)介绍了5种寻址方式。

6.6节(208)介绍了高级语言转换成机器语言并最终执行的过程。要经过编译(生成汇编语言)、汇编(生成包含机器语言的目标文件)、链接(分开目标文件中的数据段和代码段)、装入(操作系统读取可执行文件的代码段,装入内存的代码段……)。

目前先总结到这里,第六章的主要内容总结完毕。主要是为看第七章做准备,巩固了重要内容。如果有遗漏再补充。

 


第六章-计算机体系结构的评论 (共 条)

分享到微博请遵守国家法律