一直对「程序如何在计算机中跑起来的」很感兴趣,也看过一些相关的书籍和文章,前段时间在多看阅读上看到一本相关的书,用了几天时间看完后,觉得很不错,用简单易懂的语言,围绕计算机是怎样跑起来的,把相关的知识串起来,虽然每块讲的都很浅,但令人印象深刻。
书的作者是日本的矢泽久雄,作者那个年代,计算机还是8比特微型计算机,面对为数不多的技术,可以从容地把时间花在学习计算机基础上。但这些基础知识,即使到了今天也没有太大变化,即便是面对复杂的最新技术,一旦回归到计算机的基础知识,就会很好理解。
其实不仅是计算机,其他学问亦是如此。首先要划出一个「知识范围」,精通一门学问所必知必会的知识都在这个范围内。其次是掌握该范围内每个知识点中基础中的基础知识。最后是能独当一面的目标,即掌握了这些知识可以做什么。
下面是我的阅读笔记,把重点进行归纳总结。
计算机的三大原则
计算机是执行输入、运算、输出的机器
计算机的硬件是由大量IC组成,每块IC上带有很多引脚,这些引脚有的用于输入,有的用于输出。IC会在其内部对外部输入的信息进行运算,把运算结果输出到外部。
其实计算机就是台简单的机器,因为它只能做这三件事。
程序是指令和数据的集合
无论程序多么复杂,内容都是指令和数据,学习过汇编的应该很清楚。
所谓指令,就是控制计算机进行输入、运算、输出的命令。把向计算机发出的指令一条条列出来,就得到了程序。
数据是指令的对象,编程时,程序员会为数据赋予名字,称其为变量。
计算机的处理方式有时与人的思维习惯不同
用数字表示所有信息,这就是一个很具有代表性的计算机式的处理方法,和人类思维习惯不一样。例如,人们会用蓝色之类的词语描述有关颜色,计算机会使用0,0,255表示蓝色。对文字也是一样,会把文字编码成相应的数字再做处理。
试着制造一台计算机
上面提到,计算机内部主要由被称作集成电路的元件组成,虽然有各种IC,最重要的三种是:CPU、内存、I/O,只要用电路把CPU、内存以及I/O上的引脚相互连接起来,为每块IC提供电源,再为CPU提供时钟信号,硬件上的计算机就组装起来了。
时钟信号带有一个时钟,滴答滴答地每隔一定时间就变换一次电压的高低,输出时钟信号的元件叫做「时钟发生器」,里面带有晶振,根据其自身的频率产生时钟信号。时钟信号的频率可以衡量CPU的运转速度。
书中选取Z80 CPU作为CPU,TC5517作为内存,Z80 PIO作为I/O为主要器件,一步一步教我们如何制作一个微型计算机。书中提供了一个电路图,我跟着作者的逐步介绍,用彩色笔一步步描画相应的电路,印象深刻。
具体步骤细节我就不再赘述了,感兴趣的可以阅读原书,主要总结下令我印象深刻的几个点。
IC与普通电器一样,只有接通电源才能工作,三大器件都分别带有Vcc引脚和GND引脚,这一对儿引脚用于为Vcc引脚供电,将+5V电源连接到各个IC的Vcc引脚,将0V电源连接到各个IC的GND引脚,时钟发生器也要连接上,这样接通电源后这些IC和时钟发生器就可以工作了。
微信计算机所使用的IC属于数字IC,每个引脚上的电压要么是0V,要么是+5V,Vcc和GND引脚上的电压是恒定不变的,其他引脚上的电压,会随着计算机的操作在+5V和OV质检不断变化。
可以想成0V表示数字0、+5V表示数字1,那么数字IC就是在用二进制数的形式收发信息。
计算机以CPU为中心运转,要与内存和I/O进行数据的输入输出,为了指定输入输出数据时的源头或目的地,CPU上备有「地址总线引脚」。Z80 CPU 地址总线引脚共有16个,所能指定的地址共有2^16,可以指定65536个数据存取单元。
一旦指定了存取数据的地址,就可以使用数据总线引脚进行数据的输入输出了。Z80的数据总线引脚有8个, 可以一次性地输入输出8比特的数据,意味着如果想要输入输出位数大于8比特的数据,就要以8比特为单位切分这个数据。
CPU的地址总线引脚和数据总线引脚要与I/O和内存对应的引脚相连。
有一个问题,从上面电路图可以看到,Z80 CPU 使用同一组地址总线引脚和数据总线引脚连接到了内存和I/O上,CPU如何区分访问的是内存存储单元,还是I/O中的寄存器呢。Z80 CPU上的MREQ和IORQ引脚解决了这个问题,当和内存之间有数据输入输出时,MREQ引脚上的值是0,反之是1。
对内存和I/O而言,还要分清CPU是要输入数据还是输出数据,需要用到CPU的RD引脚和WR引脚,与内存和IO对应的引脚连接起来。
介绍这么多,就是让大家对计算机硬件之间的交互方式有个直观的认识,程序在这种结构中就可以跑起来,看到想要的结果。
体验一次手工汇编
先来描述下实现场景:把由指拨开关输入的数据输入CPU,然后CPU再把这些数据原封不动地输出到LED,也就是说,可以通过拨动指拨开关控制LED的亮或灭。
使用汇编语言来编程,汇编语言是根据表示指令功能的英语单词起一个相似的昵称,并将这个昵称赋予给0和1的组合,这种英文单词叫做助记符。
汇编语言的语法很简单,即把标签、操作码、操作数并排写在一起,标签的作用为为该行代码对应的内存地址起一个名字,这样后面可以直接跳转到这个地方。操作码就是表示做什么,提供了多少操作码,CPU就有多少功能。操作数表示的是指令执行的对象,CPU的寄存器、内存地址、I/O地址或者直接给出的数字都可以作为操作数。如果某个指令需要多个操作数,用逗号分割,操作数的个数取决于指令类型。
再来说下寄存器。既然数据的运算是在CPU中进行的,那么CPU内部就应该有存储数据的地方,就是寄存器。CPU带有什么样的寄存器取决于CPU的种类。Z80 CPU 所带有的寄存器如下:
比如,A寄存器叫做累加器,是运算的核心,F寄存器叫做标志寄存器,用于存储运算结果的状态,比如是否发生了进位,数字大小的比较结果等。PC寄存器存储着指向CPU接下来要执行的指令的地址。操作数必须是已存储在CPU寄存器中的数字。
好了,下面使用汇编语言实现上面说的场景,主要思路是:设定Z80 PIO,为每个端口设定输入输出模式,然后与其进行输入输出。
// 设置端口(2)为输入模式,这样用括号括起来的数字,表示的是地址编号,207表示通知将要设置输入输出模式LD A,207 //把207写入到寄存器AOUT (2),A //把寄存器A中的数据写入到IO地址对应的寄存器中LD A,255 OUT (2),A// 设置端口(3)输入输出模式LD A,207OUT (3),A LD A,0OUT (3),A// 进入一段死循环,用于把指拨开关输入的数据输出到LED灯LOOP: IN A,(0) OUT(1),A JP LOOP复制代码
知识的范围
这块内容包括流程控制、数据结构、算法、面向对象,他们是现代编程的基础,熟练掌握这些知识,编写实际业务时就简单了。这些知识都包含的很多内容,大家也都了解,就不再介绍了。
数据库和网络
这块也比较熟悉,数据库是数据的基地,方便数据的结构化存储和检索,网络解决了机器之间的数据传递,要约定好传输协议和数据格式,传输过程中要考虑数据安全问题。
这块也不过多介绍了,涉及的知识包括MYSQL等数据库、TCP/IP等网络协议、数据加密和和签名、XML可扩展标记语言等。
大家平时工作时,要有意识的累积和思考这些知识,它们是比较稳定的,是其他知识的基础,是程序员的内功。
欢迎扫描下方二维码,关注我的个人微信公众号,查看更多文章 ~