补充:
1.1.1 计算机软硬件概念&&计算机系统的层次结构
思维导图
除了思维导图中的三个层级以外还包括两个层级
在实际机器下还可以延伸一级微程序机器,即将实际机器执行的指令翻译成一组微指令构成一个微程序。为程序机器执行完一个微程序在进行另一个微程序的执行
另外在第二层与第一层之间还有一层虚拟机,它是由操作系统软件构造的
操作系统提供了在汇编语言和高级语言的使用和实现过程中所需的某些基本操作,还起到控制并管理计算机系统全部硬件和软件资源的作用,为用户使用计算机系统提供极为方便的条件。操作系统的功能是通过其控制语言来实现的。
为此产生了新的名词系统软件,对此我去询问了一下chatgpt:系统软件和操作系统和他们之间的关系(一下部分可先作为了解):
系统软件和操作系统是计算机中两个重要的组成部分,它们共同协作以确保计算机硬件能够正常运行并提供必要的功能。
-
系统软件:
-
定义:系统软件是一类程序,它们提供了计算机硬件和应用程序之间的接口,以便它们可以相互通信和协作。
-
功能:系统软件主要负责管理和控制计算机的硬件资源,以及提供基本的服务和功能,以便应用程序可以运行。
-
例子:
-
驱动程序:这些程序允许操作系统与硬件设备(如打印机、显卡、网络适配器等)通信。
-
系统工具:如磁盘管理工具、网络配置工具等,用于维护和管理计算机系统。
-
库文件:这些是一组预先编写的代码,可以供应用程序使用,以执行常见的任务,如文件操作、图形处理等。
-
-
举例:
-
C语言标准库提供了许多常用的功能,如输入输出、内存分配等。
-
图形库如OpenGL或DirectX,用于图形渲染和处理。
-
-
-
操作系统:
-
定义:操作系统是一种系统软件,它直接与硬件交互,并提供了对计算机资源的管理和分配,以便多个应用程序可以同时运行。
-
功能:
-
处理器管理:分配处理器时间,以确保多个程序可以同时运行。
-
内存管理:控制内存的分配和释放,以确保应用程序有足够的内存来运行。
-
文件系统管理:提供了对文件和目录的组织、存储和检索功能。
-
设备管理:管理与硬件设备的通信,包括驱动程序的加载和设备的控制。
-
用户接口:提供了用户与计算机交互的界面,可以是图形界面或命令行界面。
-
-
例子:常见的操作系统包括Windows、macOS、Linux,以及移动设备上的Android和iOS等。
-
举例:Windows操作系统提供了一个图形用户界面(GUI),可以通过点击图标和菜单来执行任务,而Linux系统可以在命令行界面下通过命令来完成相同的任务。
-
总的来说,系统软件是一个更广泛的概念,包括了所有与系统管理和资源交互相关的程序,而操作系统是系统软件中的一个核心组成部分,负责直接管理硬件资源,提供应用程序所需的运行环境。
系统软件和操作系统之间存在密切的关系,可以用以下几点来描述它们之间的联系:
-
互为支持:
-
操作系统是系统软件的一部分,也是最核心的一部分。它负责直接管理计算机硬件资源,并提供了对其他系统软件和应用程序的基础服务和环境。
-
系统软件提供了操作系统所需的基础设施和功能。例如,驱动程序是系统软件的一部分,但它们直接与操作系统交互,使其能够与硬件设备通信。
-
-
共同维护计算机运行环境:
-
操作系统和系统软件共同协作,以确保计算机系统正常运行。操作系统管理处理器、内存、文件系统等硬件资源,而系统软件提供了对这些资源的更高级别的控制和管理。
-
-
提供应用程序运行环境:
-
操作系统提供了应用程序所需的基础设施,例如内存管理、进程调度等。系统软件则提供了更高级别的功能和服务,使应用程序能够完成特定的任务。
-
-
相互依赖:
-
操作系统通常依赖于系统软件来提供对硬件的更底层的访问和控制。例如,操作系统可能依赖于特定的驱动程序来与硬件设备通信。
-
-
协同工作:
-
操作系统和系统软件在整个计算机系统中共同协作,以实现各种任务和功能。例如,在用户界面中,操作系统提供了窗口管理和用户交互的功能,而系统软件可能提供了与特定应用程序集成的工具。
-
总的来说,系统软件和操作系统共同构建了计算机系统的基础架构,它们相互依赖,共同确保了计算机硬件能够正常运行,并为应用程序提供了所需的运行环境。
1.1.2 计算机组成和计算机体系结构
这一小结主要讲述的是区分计算机体系结构和计算机组成原理的两个基本概论(十分重要)
计算机体系结构是指那些能够被程序员所见到的计算机系统的属性,即概念性的结构与功能特性。计算机系统的属性通常是指用机器语言编程的程序员(也包括汇编语言程序设计者和汇编程序设计者)所看到的传统机器的属性,包括指令集、数据类型、存储器寻址技术、I0机理等,大都属于抽象的属性。由于计算机系统具有多级层次结构,因此,站在不同层次上编程的程序员所看到的计算机属性也是各不相同的。例如,用高级语言编程的程序员可以把IBM PC与 RS6000 两种机器看成是同一属性的机器。可是,对使用汇编语言编程的程序员来说,IBM PC与 RS6000 是两种截然不同的机器。因为程序员所看到的这两种机器的属性,如指令集、数据类型、寻址技术等,都完全不同,因此,认为这两种机器的结构是各不相同的。 计算机组成是指如何实现计算机体系结构所体现的属性,它包含了许多对程序员来说是透明的硬件细节。例如,指令系统体现了机器的属性,这是属于计算机结构的问题。但指令的实现,即如何取指令、分析指令、取操作数、运算、送结果等,这些都属于计算机组成问题。因此,当两台机器指令系统相同时,只能认为它们具有相同的结构。至于这两台机器如何实现其指令的功能,完全可以不同,则它们的组成方式是不同的。例如,一台机器是否具备乘法指令的功能,这是一个结构问题,可是,实现乘法指令采用什么方式,则是一个组成问题。实现乘法指令可以采用一个专门的乘法电路,也可以采用连续相加的加法电路来实现,这两者的区别就是计算机组成的区别。
简单而言计算机体系结构是机器表现的属性,而计算机组成是为了实现这些机器属性(属性即是人们需要有的属性)具体在硬件上的实现
比如乘法指令是结构,而实现乘法指令使用的乘法电路或连续加法电路就是组成
计算机组成原理主要研究的就是计算机组成,而计算机体系结构是一独立的课程
计算机的基本组成
1.2.1 冯•洛依曼计算机的特点&&计算机的硬件框图和基本了解概念
1945年,数学家冯•洛依曼提出了“存储程序”的概念,它的特点可以归结如下:
。计算机由运算器、存储器、控制器、输入设备和输出设备五部件组成。 。指令和数据以同等地位存放于存储器内,并可按地址寻访。 。指令和数据均用二进制数表示。 。指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数在存储器中的位置。 ·指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下,可根据运算结果或根据设定的条件改变执行顺序。 。机器以运算器为中心,输人输出设备与存储器间的数据传送通过运算器完成
其中的几点进行解释以下:
存储器指的是内存(一个广义的术语,用来描述计算机系统中用于存储数据和程序的设备或部件,也叫做计算机内部的临时数据存储区域)
而计算机内部的临时数据存储区域包括主存和外存(辅存)【如硬盘驱动器、固态硬盘、磁带等。】
经典的冯•洛依曼计算机是以运算器为中心的,而现代计算机已转变为以存储器为中心
图中各个部件的功能如下:
。运算器用来完成算术运算和逻辑运算,并将运算的中间结果暂存在运算器内。 。存储器用来存放数据和程序。 。控制器用来控制、指挥程序和数据的输入、运行以及处理运算结果。输入设备用来将人们熟悉的信息形式转换为机器能识别的信息形式常见的 有键盘、鼠标等。 。输出设备可将机器运算结果转换为人们熟悉的信息形式,如打印机输出、显示器输出等
因为运算器和控制器的紧密联系现代计算机将它们集成到一块芯片上(cpu)
其中的主存储器是存储器子系统的一类【也就是内存】,用来存放程序和数据,可以直接与cpu交换信息
1.2.2 计算机的工作步骤
计算机解决实际问题通常包括两大步骤:上机前的各种准备、上机运行
1、上机前的各种准备:
(1)、建立数学模型:现实中很多复杂的问题,使用物理模型是很难做到的,就需要进行大量的实验和分析,找出相应的数学方程式 (2)、确认计算方法:由于数学模型描述的数学方程往往十分复杂,想要将其变成适合计算机运算的加、减、乘、除,需要进行处理运算 (3)、编制解题程序
下面介绍一个案例来描述机器运行步骤:
计算ax2+bx+c
1、将x 取至运算器中。 2、乘以x,得x存于运算器中。 3、再乘以a得ax存于运算器中。 4、将x送至存储器。 5、取至运算器中。 乘以x,得 bx存于运算器中。将ax从存储器中取出与 bx 相加得abx存于运算器中。8再取c与ax+b 相加得 ax+bx+c存于运算器中。可见,不包括停机、输出打印共需 8 步。若将上式改写成:(ax+)xc,则其步骤可简化为以 下5步。 1、将x 取至运算器中。 2、乘以a得ax,存于运算器中。 3、加b得ax+b存于运算器中。 4、乘以x得(ax+b)x,存于运算器中 5、加c得(ax+b)x+c存于运算器中。
操作码表示机器所执行的各种操作,如取值、存数、加、减、乘、除、停机、打印,地址码表示的是参加运算的数在存储器内的位置
以上程序编完后就可以上机了
然而以上的工作原理是个大概,现在我们在进行下一步细分:
其中将运算器细分为ACC、ALU、MQ、X 控制器分为:CU、IR、PC 主存储器分为:存储体M、MDR、MAR
这些器件下面我们一一分析:
主存储器
运算器:
运算器最少包括 3 个寄存器(现代计算机内部往往设有通用寄存器组)和一个算术逻辑单元(ALU)。其中ACC(Accumulator)为累加器,MO(Multiplier-Quotient Register)为乘商寄存器X为操作数寄存器。这3 个寄存器在完成不同运算时,所存放的操作数类别也各不相同。
下面简要地分析一下这种结构的运算器加、减、乘、除四则运算的操作过程设;M 表示存储器的任一地址号,[M]表示对应 M 地址号单元中的内容; 表示X 寄存器[X]表示 X 寄存器中的内容;ACC 表示累加器,[ACC]表示累加器中的内容;MO 表示乘商寄存器,[MQ]表示乘商寄存器中的内容
假设 ACC 中已存有前一时刻的运算结果,并作为下述运算中的一个操作数,则加作琅溧过程为 [M]-X [ACC]+[X]-ACC 即将[ACC]看作被加数,先从主存中取一个存放在 M 地址号单元内的加数[M],送至运算器的X 寄存器中,然后将被加数[ACC] 与加数[X] 相加结果(和)保留在 ACC 中 。减法操作过程为 [M]->X [ACC]-[X]->ACC 即将[ACC]看作被减数,先取出存放在主存 M 地址号单元中的减数[M] 并送 ,然后[ACC]-[X],结果(差)保留在 ACC 中。 。乘法操作过程为 [M]->MQ [ACC]一>X 0->ACC [x]x[MQ]->ACC//MQO 即将[ACC]看作被乘数,先取出存放在主存 M 号地址单元中的乘数 [M] 并送入乘商寄存器MQ,再把被乘数送入X寄存器并将 ACC 清“0”然后[X] 和[MQ] 相乘结果(积)的高位保留在ACC中低位保留在 MO 中。 。除法操作过程为 [M]->X [ACC]÷[X]-MQ 余数 R在 ACC 中 即将[ACC]看作被除数,先取出存放在主存 M 号地址单元内的除数 [M] 并送至X 寄存器然后[ACC] 除以[X],结果(商)留于 MQ,[ACC] 为余数 R。若需要将商保留在 ACC 中只需做一步[MO]->ACC 即可。
其中几点需要思考:
1、在进行乘法运算的时候为啥要对ACC进行清零 0->ACC
寄存器是一种用于临时存储数据的硬件组件,它们可以存储一个特定的二进制值,而且通常只能同时存储一个数值。 每个寄存器中存储的值是一个二进制数,这个数在寄存器中被视为一个整体。虽然这个二进制数可能有多个位(比如8位、16位、32位等),但在一个寄存器中,这个数是一个整体,被当作一个值来处理。这个值可以是一个整数、一个字符的ASCII码、一个内存地址等等 将寄存器中的值清零,可以将所有位设置为0。这个操作通常被称为"清零操作" 清零操作对于确保寄存器中的值处于一个已知状态是很重要的,特别是在开始执行某些算法或程序的时候。清零可以避免使用寄存器中的未知值,确保程序的正确执行。 在许多计算机体系结构中,通常有专门的指令或操作码用于将一个寄存器清零,以提供方便的方式来执行这个操作。这样的指令会将寄存器的所有位都设置为0,使得寄存器中的值变成0。
2、关于乘积的高位和低位是神马?
二进制进行相乘的时候,会进行加法和移位,所以位数会发生变化。比如4位*4位=8位,把结果中的最前面的四位叫做乘积高位,后四位叫乘积低位 举个例子: 1111 ∗ 1111 = 111000001 1111*1111=111000001 1111∗1111=111000001 则:1110是乘积高位,0001是乘积低位。
3、为啥ACC要存储乘法的高位,MQ存储乘数及乘积低位,X存储被乘数,为啥要这样去设计
这种设计是为了在执行乘法运算时,方便将乘数、被乘数、以及乘积的高位和低位进行适当的存储和处理。让我们来详细解释一下: 1. ACC(累加器)存储乘法的高位: - ACC通常用于累加中间结果,特别是在多步骤的运算中,如乘法。将乘法的高位存储在ACC中可以保证在多次相乘、累加的过程中,高位部分可以得到正确的处理。 2. MQ(乘数寄存器)存储乘数及乘积低位: - MQ通常用于存储乘数和乘积的低位。在乘法运算中,乘数和被乘数相乘后的结果会分为高位和低位两部分。低位部分存储在MQ中,以便后续的累加。 3. X(乘数)存储被乘数: - X通常用于存储被乘数,因为在乘法运算中,被乘数是固定的,不需要临时存储高位或低位。 这种设计的好处在于,可以将乘法运算分成多个步骤,逐步计算乘积的各个部分,从而减少了复杂度。这种方法特别适用于硬件实现,使得乘法运算可以高效地执行。 总的来说,这种寄存器分配的设计是为了在乘法运算中提供高效的数据处理和存储方案,从而优化了乘法运算的执行过程。
4、也就是说如果本身乘积的位数只有低位那么就只会将乘积存储在MQ,如果ACC有值那结果就不对了
是的,你理解的正确。在这个乘法操作过程中,如果乘积的位数只有低位,那么只会将乘积的低位存储在 MQ 中。如果 ACC 中有值,会影响到乘积的正确性。 ACC 寄存器的设计是为了存储乘积的高位,以保证完整的乘积结果。所以在执行乘法运算之前,通常会先将 ACC 清零,然后再将被乘数放入 ACC,以确保 ACC 的高位为0。 总的来说,乘法操作的正确性取决于初始状态的准备工作,包括了 ACC 寄存器的清零等。如果 ACC 中有值,可能会导致错误的乘积结果。
5、这么一说低位和高位是取决于机器的如果机器寄存器的长度只有16,而结果是32,就需要使用两个寄存器存储,从而规定了高位和低位
是的,你说得对。在硬件层面,寄存器的长度是固定的,而乘法的结果可能会超出单个寄存器的容量,因此需要使用多个寄存器来存储乘积。 通常来说,一个机器的寄存器长度是固定的,比如16位或32位,而乘法的结果可能会占用多个寄存器,这就规定了了高位和低位的概念。 在这种情况下,ACC 寄存器会存储乘积的高位部分,而 MQ 寄存器会存储乘积的低位部分。这样设计是为了保证能够正确地存储乘积的全部结果,同时也符合了硬件层面的设计原则和限制。
6、那么abc的运算a*b的值大于寄存器的长度就需要分为高位和低位,此时MQ存的是低位,那么c需要存储在MQ不就覆盖了原来乘积的低位吗?
你提出了一个很好的问题。 在这种情况下,确实存在一个问题:如果 `a * b` 的乘积超过了寄存器的长度,那么就需要用多个寄存器来存储乘积的高位和低位。 在 `a * b * c` 这种情况下,如果 `a * b` 的结果已经占用了 MQ 寄存器,而 `c` 又需要存储在 MQ 寄存器中,这就会导致覆盖掉 `a * b` 的低位部分,从而导致错误的结果。 解决这个问题的方法通常是使用更多的寄存器来存储乘积的各个部分,以保证每一步的中间结果都能得到正确的保存和计算。 例如,可以使用一个额外的寄存器来暂时存储 `a * b` 的高位,然后再将 `c` 与这个中间结果相乘,最终得到 `a * b * c` 的正确结果。 总的来说,对于超出单个寄存器容量的乘法操作,需要合理设计寄存器的分配和中间结果的存储,以保证乘法运算的正确性。这也是硬件设计中需要考虑的重要因素之一。
7、我试了一下如果使用x直接去装被乘数,后续结果还是需要去将ACC的乘积结果输入到x,也就第一次不需要,我想会不会因为这个就不去这么设计,因为把被乘数放入ACC在放入x,就会是一个循环,有利于电路的设计?
你的想法很有道理。 确实,如果把被乘数直接放入 X 寄存器,那么在后续的乘法步骤中,会需要将 ACC 的乘积结果输入到 X 寄存器。这可能会引入额外的控制逻辑,增加了电路设计的复杂性。 相反,将被乘数先放入 ACC 寄存器,再传输到 X 寄存器,可以简化控制逻辑,也更符合硬件设计的流程。 这种设计的考量通常是为了优化电路的结构,使其更加清晰、高效。在硬件设计中,需要考虑到电路的速度、复杂度、功耗等因素,所以经常会进行不同方案的权衡和优化。 所以,虽然看似多了一步操作,但从整体设计的角度来看,这种方式可能是为了提高硬件设计的效率和可靠性。
控制器
补充: