首页 > 从 CPU 开始运算到计算机显示,发生了什么?

从 CPU 开始运算到计算机显示,发生了什么?

CPU 只能进行数值运算,那么计算机是怎么显示出字符的,怎么进行编译的,原理是怎样的?

小白求指点!


为什么这么多人踩这个问题呢?没有不好的问题,只有不好的答案。踩这个问题的,我只能姑且认为你没有好的答案。


CPU 只能进行数值运算,

错。

CPU(中央处理器)主要由控制器运算器

运算器包括算术逻辑单元(ALU)、累加器、寄存器、路径转换器等。

至于你提到的数值运算,只是其中的一小部分,而且是很重要的部分。

因为计算机最初的数值运算只能进行位运算:即与、或、非。而运算的结果放在寄存器。

比如加法运算,在电路上是这样的:

  1. A B 存放相加的两个数字。
  2. 相加的结果:

    1. 低位是 A 或 B
    2. 进位是 A 与 B

A B 为 0 或者 1。对应的是电压的高低。

后来,由于这部分功能是经常用到的,于是就把这些东西也集成为了专有芯片:加法运算器。

在 PC 上,就直接集成到了 CPU 里面了。

CPU 的每次运算包括:提取、解码、执行和写回。

这里面涉及到的寻址,指令……我就不解释了,你看看相关的书籍。而执行阶段,不仅仅是算数运算,逻辑运算,还包括其它的。

那么计算机是怎么显示出字符的,怎么进行编译的,原理是怎样的?

在电子计算机发明以前,机器就已经可以显示字符了。可以百科一下约翰内斯·古登堡

如果你知道早期计算机的历史,你也就知道为什么很多语言的输出不是用 output 函数,而是用 print 函数了。因为早期计算机只能打印机,没有显示器。

前面已经讨论了数值计算。现在插播广告,如果想了解更多可以去我博客看看:代码之谜系列。

计算机的组成,除了 CPU 还有几个主要部件:存储器、输入/输出。

现在我们构建一个最简单的显示器。

这个显示器是黑白的,显示器的分辨率是8*8(确实很简陋)。在显示器上,布满了64个小灯。(插播因特尔广告:灯,灯灯灯灯)

这些灯,灯灯灯灯,有一个特点,就是电压低了,则暗或者灭,电压高了,则显示。

灯的正极都连接到了一个电源上,而负极,都连接着一根线,一共64根线。

效果图(来自百度百科,密集恐惧症者勿看)

如果让灯都灭掉,则引脚上的电压都是低压,于是我们都给他们发送 0

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

这个本来应该是正方形的,凑合看吧。

这个显示器也是一个芯片。

如果我们想显示数字 1,则我们发送

00011100
00011100
00011100
00011100
00011100
00011100
00011100
00011100

有点糙,凑合看吧。

对应的十六进制是 1C,十进制 28

因此,我们想显示1,则只需要把长整形的无符号数28,发送到显示器芯片的地址。

现在问题来了,我想显示1,却发送的是28。如果显示器的分辨率更大,我们需要发送另一个数字。也就是说,对于不同型号,不同分辨率的显示器,我们的操作确实不一样的。这样显然是违反三个代表的主体思想的,也不利于构建和谐社会。

于是,标准开始制定,ANSII,UNICODE……

只要,1 的内部代码就确定了,十六进制的 31,十进制的 49。

而上面提到的 28 对应的是 1,则为字形表。

当我们想显示 1 的时候,只需要把 1 的 ascii 码发送给显示器(我这么写是为了简化流程,其实是发送给了负责处理显示功能的API),就可以了。

如果想了解更多的显示细节,这已经不是CPU的工作了,而是 GPU。

我的github地址:https://github.com/justjavac


显示的字符是经过一系列转换的,计算机只能识别二进制是因为晶体管的接通和截断两种信号,刚好符合二进制的0和1,但是人能是别的数字是十进制所以需要转换为十进制,字符类的是十六进制,


以常见的1366 * 768分辨率举例,有1366 * 768 = 1049088个像素点,假设每个像素点有256个色,那么就需要能区分1049088 * 256个不同状态,这个状态可以用一个值去表示,这个值传输给显示设备,显示设备就能显示出对应的图像。


答案已忽略

【热门文章】
【热门文章】