计算机基本上有以下配置:
CPU是Central Processing Unit的缩写,也叫处理器。根据程序进行各种数值计算、信息处理、设备控制等。
CPU充当计算机的指挥中心。,寄存器是 CPU 内部的一个小型存储设备,稍后会详细介绍。
内存也称为主存储器,内存由地址和数据表示。数据是将某些东西(例如文本或图像)表示为一组数字。地址是写入或读取数据时在内存中的位置。
想象一下邮箱,您在邮件上写下您的邮寄地址,地址起着类似的作用,读写数据相当于以给定的号码作为地址,将邮件进出邮箱。C语言中的指针是一个将地址抽象出来的概念,数据以代码的形式记录,代码是具有某种意义的数字。其他类型的数据,例如字符,除了被视为整数外,也被记录为数值。程序也被记录为代码。
内存大致可以分为两种:
I/O是input/output
的缩写,也叫输入/输出设备。
任何连接到计算机的设备,如键盘、鼠标、显示器、硬盘等都数据I/O。设备和计算机之间的边界称为接口。
I/O也有地址和数据的概念,通过指定地址来确定控制目标,通过输入/输出数据来执行实际控制,像内存读写一样控制I/O的方法称为内存映射I/O,对输入/输出进行特殊控制的方法称为端口映射I/O,端口是输入和输出的特殊地址。
总线是一种公共信号电路,承载 CPU、内存和 I/O 之间的所有信号。源于车辆总线,它被比喻为不同目的地的乘客乘坐一辆公共汽车的方式。
有两种类型的总线:
它们分别与内存和I/O交换地址和数据信号。
您可能认为 CPU 作为计算机的指挥中心,其行为非常复杂。不过仔细想想原理,其实也不过是简单的处理而已,CPU能做的就是复制数据,进行简单的算术运算和逻辑运算等计算,进行比较等简单的判断,所有具有复杂功能的程序都是通过这些简单的过程组合起来实现的。
我相信你们中的一些人想知道如何通过组合如此简单的过程来真正实现复杂的计算机行为。
例如,复杂的科学计算,你听说过算法这个词吗?只要提供必要的空间和时间,原则上任何可以由算法定义的计算都可以实现。构成算法的各个处理过程可以通过组合上述简单的函数来简单描述(否则不能称为算法)。算法将这些过程组合在一起,因此可以说它们可以表示为简单函数的组合。
当然,也可能有复杂到你有多少TB的内存都无法完成的计算,或者需要一天、一周,甚至是无数的计算来完成。
计算理论始于诸如计算可以做什么以及首先什么是计算等问题。“计算机”一词原意为计算器,但从计算理论的角度来看,计算机在原则上是一种只能进行计算的机器。说到这里,你可能会认为计算机的可能性是如此之小,但最好是认为“计算”这个词的可能性比你想象的要广泛得多。
顺便说一句,原则上不可能的计算,或者太复杂以至于实际上不可能的计算,无论使用什么高级语言,都无法用计算机实现。反之,任何可以用高级语言实现的计算都必须是可计算的,可以表示为简单函数的组合。
在屏幕上绘图呢?
我们都知道电脑屏幕是由称为圆点的小点组成的,您可能还知道,所有颜色都可以通过按固定比例混合光的三种基色(红、绿、蓝:RGB)来表示。实际上,如果你将对应于三种基色中每一种的亮度的数值写入某个地址,屏幕上对应于该地址的点就会被着色,屏幕是由 CPU 设置值绘制的。
顺便说一句,最近,由专门负责屏幕绘制的特殊处理器(GPU:图形处理单元)执行处理而不是让CPU直接在屏幕上绘制已经变得很普遍。而GPU基本上结合了数据复制、四次算术运算和逻辑运算等简单的计算,以及比较等简单的判断。GPU 执行一些高级计算,例如三角函数,但原则上它们是简单计算的集合。如前所述,所有复杂的科学计算都是简单计算的集合!
鼠标的输入是通过读取鼠标发出的二维坐标信号的数值来实现的。鼠标识别并量化用户移动的相对距离,I/O一般通过读写数值数据来实现与外界的通信。尽管它被称为控制,但 CPU 只是以良好的时序对 I/O 读取和写入数值。机器人、汽车、飞机、火箭等等,再先进的控制,都是基于此。
你怎么认为?
想象一下,如果你所知道的计算机的功能可以通过组合简单的功能来实现。
现在,让我们停止谈论 CPU 的可能性,看看它们实际上是如何工作的。
典型的 CPU基于称为寄存器机的计算模型,其他典型的计算模型包括自动机、图灵机、lambda 演算和堆栈机,它们通常用于代码生成。。
上文提到,CPU有一个小型的存储设备,叫做寄存器(processor register),每个寄存器可以存储8bit、16bit、32bit、最近的64bit数,一个CPU有几个到最多几十个寄存器。
寄存器的存储容量比内存小,但读写速度非常快,寄存器中存储的值可用于算术运算和逻辑运算。CPU 执行的处理是从内存中读取一个值到寄存器(load),执行一些操作,然后将寄存器中存储的结果写入内存(store)。
存储在寄存器中的值可以解释为原始值或地址,解释为地址时,也有区别,比如是解释成绝对地址,还是解释成相对地址,还是解释成简单的加法或乘法的结果。
这种指定解释的方法称为寻址方式,可以使用机器语言指令指定。
一些 CPU 有单独的寄存器来指定地址和存储数据,然而,大多数最新的 CPU使用可以处理地址和数据的通用寄存器,为了简单起见,本文以通用寄存器为前提进行。
具体寻址方式举例如下:
有些寄存器有特殊用途,称为专用寄存器或专用寄存器。每个CPU都有的特殊寄存器是程序计数器和栈指针。
根据 CPU 的不同,堆栈指针可能定位为通用寄存器之一,而不是特殊寄存器。
CPU 从程序计数器指向的内存中读取机器码,分析其含义,执行,并写入结果。获取完成后,将程序计数器递增 1,还有一些指令会为程序计数器赋一个特定的值,即移动程序计数器(称为分支指令)。
这个获取/解码/执行/存储周期称为一个指令周期,CPU 在执行一条机器语言指令时总是执行一个指令周期。
执行一条机器语言指令时,总是执行一个指令周期,但是并不一定要严格按照:
比如在执行一条指令的同时,fetch下一条指令,也可以高效地进行,这种方案有很多变体,例如指令流水线和超标量方案,但是第一个意识到这一点的人真的很聪明,当我第一次知道它时,我被它的巧妙所震惊。
堆栈指针是出现在其中一种数据结构堆栈结构中的概念,寄存器堆栈指针用于实现函数、过程和子程序调用。
当在函数f中调用了函数g,再调用函数h,当函数h结束时,返回到函数g,当函数g结束时,返回到函数f。从这个调用关系来看,就是后进先出,栈也是一种后进先出的数据结构,所以,栈就是用来实现CPU上的函数调用的。
演示调用最简单的子程序。子程序调用当一条指令被取/译码时,当前程序计数器值被写入执行/存储周期中栈指针所指示的地址,栈指针和将要调用的子程序的地址分配给程序计数器。
另一方面,当获取/解码退出子程序并返回的指令时,堆栈指针在执行/存储周期中递减,从堆栈指针指示的地址读取值,并且值分配给程序计数器。增加。
根据不同的CPU类型,栈指针的增减方向和顺序会有所不同,但基本上都是用这个原理来调用子程序和从子程序返回。
标志是存储计算结果的特殊寄存器,常见标志有:
负整数通常用2 的补码表示,2 的补码进行位反转并加 1,使用 2 的补码的原因是加法器和减法器电路可以很好地集成在一起。
从前一段时间开始,机器语言和指令这两个词就被频繁使用,有些人可能想知道它们到底是什么。
CPU解释出来的指令,其实都是用相应的数字来表示的,代码是一个数字,它最初具有一些与之相关的含义。即使是 CPU 解释的指令,指令和编号也是对应的,出于这个原因,代码这个词也意味着一个程序。
一组指令称为指令集。
机器语言到底是什么?
它是CPU直接执行的指令和数据的系统,包含了指令集。
当在广义上使用指令集的结构时,它被称为指令集架构。
我们经常使用 x86 和 IA-32 等术语来指代 Intel CPU 及其兼容的 CPU。追溯这些词源,x86 是一个词,来源于英特尔的 CPU 型号,过去是 8086、80286、80386、英特尔 486 (i486) 等。IA-32(Intel Architecture, 32-bit)原指80386之后的i486、Pentium、Celeron、Xeon、Atom(及其兼容CPU)等32位CPU所使用的指令集架构。
机器语言指令大致分为:
机器语言其实就是代码,也就是数字,但是人类很难理解,所以用一种叫做汇编语言的编程语言编写,与机器语言一一对应,与高级语言不同,汇编语言依赖于 CPU 类型,并且通常与不同的 CPU 类型不兼容,根据汇编程序的类型,也存在差异,汇编程序是将汇编语言翻译成机器语言的工具。