前言
在计算机日新月异发展的今天,一系列设备的复杂性和多样性让我们眼花缭乱。通常我们认为的计算机是大家使用的电脑设备,其实在日常生活中各种电器设备都可能含有一个微型计算机系统。 这些计算机是广义上的含义,我们可以把含有CPU,内存,I/O设备这三个主要元器件的设备都叫做计算机。只不过,从个头上来说,有的是微型计算机,有的是大型计算机,当然还要超级计算机。一、简易的微型计算机
一个最简易的微型计算机系统可能只包含CPU,内存,I/O,但是要想让它真正的正常工作,则需要更多的辅助设备。在集成电路板上,可以比较简单的认出的是一些电阻,电容,开关等。除了这几个以外,值得我们认识的还有:-
时钟发生器,是一个产生时钟信号的元件。它输出一个叫做"时钟信号"的电信号,每隔一定的时间就变换一次电压的高低。产生电信号的根本是它带有晶振,根据其自身的频率(振动的次数)产生时钟信号。日常生活中,我们熟知的CPU的频率是由它来决定的。
-
输入设备,像我们手中的键盘和鼠标一样的东西。向内存输入数据的方式有两种:第一种是通过I/O元件发起CPU指令,让它读取和写入内存;第二种是通过DMA方式向内存写入指令和数据。这里如上左上角的方块就是代表的DMA输入元件。而我们发起CPU运算的数据输入则是通过I/O来进行中转的。
-
输出设备,不管是显示器,还是五彩斑斓的LED灯光,还是大型机器的操作设备,它们都通过I/O输出的数据进行显示或者操作。明显来看,输出并不代表是在显示器上显示出图案或者文字,也可能是一个机械手打了你一拳。
二、机器语言
1.CPU内部结构
首先我们需要清楚的一点是,CPU里的内部构造:
可以看出,CPU内部是很多功能不同的寄存器组成的。而这些寄存器里是通过电压不同的电信号来记录数据,也就是通常我们所说的0和1。所以,本质上来讲计算机只认识0和1。它能做的运算只是把0变成1,把1变成0。这是一个很神奇的事情,通过0和1这两个简单的数字,计算机竟然能够完成我们平常见到的各种各样的运算。
2.机器语言
0和1是怎么来运算的呢?
简单的来说,通过0和1的排列组合,让它表示一些事情。图示中一直出现的Z80是要给8比特的CPU,它代表的意思是这个CPU用8位数字(0和1)组合在一起来表达一个含义。例如二进制运算中的00000010等于十进制中的数字2。对于计算机来说,任何事物都可以用0和1排列组合成的数字来进行表示。当然这个表示是人为定义的,所以在不同的CPU里面,同样的排列组合可能代表不同的意思。
在一个8比特的机器语言里,你可能看到的是:
00000000 00111110
00000001 11001111
00000010 11010011
…
是不是完全看不懂,那就对了。
2.汇编语言
一大串的0和1,总是让人头大的。几百上千,甚至过完的指令和数据含义,想要记住是不可能的。所以在机器语言的基础上,人们发明的助记符。把00111110变成日常生活中的英文单词,这样就简单很多。
这就是汇编语言的出现:
LD A,207
OUT (2),A
LD A,255
…
上述代码的含义是,LD是Load的缩写,而LD A,207是把207读入到寄存器A中,而后OUT (2),A,是把寄存器A的数据写入到I/O地址对应的寄存器中。
前面提到,不同CPU的0和1组合可能代表不同的含义,而添加助记符之后的汇编语言,则可以把这种差异进行统一。而在运行的时候,计算机自己把这些转换成它认识的0和1。当然,有兴趣的话,根据CPU的文档,也可以手动转换。
虽然代码变得似乎简单了些,但是看起来很多寄存器还是难以理解,但是计算机就是这样,它基本都是由寄存器组成的不同功能。因为它只是存储0和1,然后改变0和1。而为了更方便编程,很多更高级语言应运而生,C/C++/Java/C#/Lua/Js等等,它们逐步的更符合人类的思维习惯。