计算机基本原理 学习笔记(四)

本篇目录

接上)

六、指令和程序

1.指令

(1)指令

(2)指令集

(3)指令长度

(4)指令地址寄存器&指令寄存器

(5)指令的执行过程

2.时钟

(1)时钟频率

(2)超频&降频

我的疑惑

1.开机后寄存器的初始值

2.在哪个阶段修改指令地址寄存器

总结


接上一篇 学习笔记(三)

六、指令和程序

1.指令

(1)指令

CPU是计算机的大脑,负责运行各种程序,而一个程序是由指令(指示计算机要做什么)组成的。

无论是指令还是数据,都是以二进制形式存储在内存中,假如某个内存单元中存储的是“0000 0001B”,当CPU要从这个单元取出指令的时候,这个内容就会被当做指令来解码;当CPU要从这个单元取出数据来参与运算的时候,这个内容就会被当做数字1来运算。(在学完汇编语言后,我对这一点印象深刻。)

一条指令包含了操作码以及要访问的内存地址或寄存器。当CPU读取一条指令后,可以根据操作码来执行对应的操作,并通过读写内存或寄存器来获取数据参与运算,或者是存储运算结果。换句话说,操作码指示CPU该做什么操作,而内存地址或寄存器指示CPU数据来源或是将运算结果保存到哪里。

(2)指令集

① 指令集

一个CPU可以支持多种不同的指令(如“向内存中存储一个数据”、“将两个数据相加”、“跳转到某一条指令”等),每一种被支持的指令都有一个编号,称为操作码。CPU的指令集中存储了该CPU支持的所有指令(的操作码)。计算机之所以强大,就是因为它是可编程的,越高级的CPU往往拥有更大的指令集,可以更加灵活地实现更多功能。硬件中没有设计的一些功能,可以通过程序中的一条条指令来完成。

② ADD 指令&SUB指令

ADD指令是加法指令,需要两个操作数作为参数,运算结果保存在第一个参数中,因此参数给出的顺序很重要。SUB指令是减法指令,也需要两个操作数作为参数,运算结果也是保存在第一个参数中。

通过ADD指令、SUB指令与跳转指令的结合,可以编写程序实现乘法或者除法功能。虽然硬件中没有设计乘法或者除法电路,但是通过软件(编程)可以实现。

③ 跳转指令

JUMP是无条件跳转指令,可以跳转到程序的指定位置,原理是根据指令中的参数修改CPU中的指令地址寄存器(汇编语言中的CS:IP)。

还有一些是有条件跳转指令,只有当满足条件时才发生跳转,否则就什么也不做。比如 JUMP_NEGATIVE指令,只有当标志寄存器中的负数标志(ALU计算结果会输出标志寄存器的值)为true时才发生跳转。

④ HALT指令

HALT指令表示程序的结束。

(3)指令长度

一条指令的长度即指令长度。如果指令长度为8bit,假设用4位表示操作码,那么这个CPU的指令集中最多可以有16条指令,更多的指令就无法表示了;假设用另外4位表示内存地址,那么最多只能操作16个内存单元,这着实不多。为了扩展功能,现代CPU通常采用32位或者64位指令长度,这样就可以有更丰富的指令集。

还有一种策略是可变指令长度。在取值阶段,如果读到的指令是JUMP,那么很显然这个JUMP指令的后边会紧跟着一个表示目标跳转位置的参数;如果读到的指令是HALT,那么显然这个HALT指令不需要任何参数,可以直接执行。这会使取值阶段变得复杂一些,但是每条指令的长度可以是不同的(而不是JUMP指令、ADD指令、HALT指令都必须是8bit的长度),这种设计更加灵活。(根据之前学的汇编语言做一点补充:同一个指令的长度是固定的,比如ADD指令,在同一个CPU中ADD指令如果是8bit那么就一直是8bit,但同时HALT指令的长度可以是2bit,如果也要使用8bit那就浪费了空间。CPU分析指令的操作码就可以知道这条指令的长度,并且能正确地取出这条指令中操作码后边跟着的参数。)

(4)指令地址寄存器&指令寄存器

一个程序通常有多条指令。为了能够按顺序执行指令,CPU中有一个“指令地址寄存器”和一个“指令寄存器”。当启动计算机时,所有寄存器的初始值为0 。

① 指令地址寄存器,用来存储当前指令所在的内存地址(指令以二进制形式存储在内存中),CPU中的控制单元会自动修改指令地址寄存器的内容,以获取下一条指令。

② 指令寄存器,用来存储从内存中取出来的当前的指令。这条指令会在控制单元中被解码,之后控制单元将操作码以及相应的数据送往ALU进行计算,或者是与寄存器或内存通信以存取数据。

(5)指令的执行过程

① 第一阶段:取指令

根据指令地址寄存器中存储的地址(汇编语言中学过,这就是CS:IP指向的内存地址),从内存中读取数据,将读取到的数据存储到指令寄存器中。

② 第二阶段:解码

将指令送往“控制单元”这个部件中进行解码,即根据指令中的操作码判断应当执行的操作是什么。控制单元就像乐团的指挥,控制CPU中各个部件执行各自的操作。

③ 第三阶段:执行

这一步由控制单元负责指挥。如果需要数据参与运算,那么控制单元就与寄存器或者内存通信以读取数据。如果需要计算(包括算术运算与逻辑运算),控制单元就将相应的数据以及操作码作为输入,送往算术逻辑单元(ALU)处理。运算的结果需要存储,那么控制单元就与寄存器或者内存通信以写入数据。

最后还有一步:根据当前指令的长度,修改指令地址寄存器,目的是让这个寄存器中的地址指向下一条指令所在的内存单元。至此,一条指令执行完成(或者说一条指令周期完成)。

2.时钟

(1)时钟频率

一条条指令的执行,需要有条不紊地进行。在CPU中是“时钟”这个部件以精确的间隔触发电信号,控制单元根据这种信号来按照步骤执行操作。就像列队前进时有一个人负责有规律地喊“一二一”,从而确保整个队伍有序前进。也有点像做广播体操时,广播中会播出口令“一二三四五六七八”,而做操的人就按照口令来做出对应的动作。

时钟有时钟速度(频率),单位是赫兹Hz,1Hz表示每一秒钟CPU完成一个指令执行周期。这个速度不能太高。就像做广播体操时,如果口令喊得太快,做操的人就会无法跟上。计算机中的电信号也需要一定的传送时间,如果时钟速度过高,CPU会跟不上速度,可能会过热或者产生乱码。

(2)超频&降频

不过现代计算机中,一般厂商会留有余地,使得用户可以在一定范围内超频,即提高时钟速度以加快CPU的速度。有时,也可以通过降频来省电。许多现代处理器可以动态调整时钟的频率,以优化资源利用。


我的疑惑

1.开机后寄存器的初始值

公开课中老师讲的是,当启动计算机时,所有寄存器的初始值为0 。这一点与x86汇编语言中学的不相符,汇编语言中讲的是,CPU一加电就会读取FFFF0处的指令,那也就是说初始值CS=FFFF IP=0000。也许是因为,这个公开课的老师是讲解了通用的原理,而汇编语言教材的作者是讲解针对8086CPU的具体情况?

2.在哪个阶段修改指令地址寄存器

在公开课视频中,老师讲的是取指、解码、执行,最后才是修改指令地址寄存器;然而在之前学习汇编语言时,王爽老师(教材作者)讲的是取回指令之后,就将CS:IP指向下一条指令,然后再执行当前指令。我的疑惑是:究竟修改CS:IP(或者说指令地址寄存器)的这一步,是在什么时候进行的呢?)

2022.11


总结

本篇内容:

指令、指令集、指令长度、指令执行的过程、时钟频率

猜你喜欢

转载自blog.csdn.net/Dr_Cheeze/article/details/127925480