• 欢迎访问:祀与戎,国之大事,在祀与戎。 手机号码:
  • 欢迎访问:祀与戎,国之大事,在祀与戎。
  • 欢迎访问:祀与戎,国之大事,在祀与戎。祀与戎
  • 祀与戎,国之大事,在祀与戎www.siyurong.com
  • 祀与戎,国之大事,在祀与戎。如果您觉得本站非常有看点,那么赶紧使用 Ctrl+D

有没有一本从电路开始讲然后汇编再到C语言的书?

思想观点 siyurong 4年前 (2022-11-11) 3次浏览 已收录 0个评论

本人计算机科班出身,一路读到博士,计算机的课程没少上。这是我见过的最好的计算机科学的课程。强烈推荐!免费的哈,我不是卖课的,别误伤,哈哈

总共40课,每课10分钟。讲得非常简单易懂,而且覆盖了计算机领域的所有重要概念和研究领域。

课程的第一部分就是讲怎样从电路开始一层一层地构建出一个CPU并运行高级语言写的程序的。做到了在知识体系上打通:软件 -> 硬件 -> 电学。

预警:课程全英文,英式发音,且语速奇快。有这个中文翻译或字幕的朋友欢迎评论分享。

https://thecrashcourse.tumblr.com/downloads/compsci​thecrashcourse.tumblr.com/downloads/compsci

UPDATE:接近1:4的点赞收藏比,朋友们,这样真的好么

文末更新了评论里提到的本书(第三方)配套的nandgame网站,和一个from scratch自制计算机的youtube视频博主。


The Elements of Computing Systems (a.k.a. From Nand to Tetris)

何止是电路,这本书带着你从NAND与非门开始,构造出CPU和整台电脑,然后在这台电脑上开发操作系统、编译器,最后写出一个俄罗斯方块(Tetris)游戏。

更关键的是,这本书的两位作者亲自开设了一门MOOC网课,全套视频免费看!

里面还有他们的lab,以及他们研发的几乎所有配套软件,包括CPU模拟器、汇编器、虚拟机,等等等等。只要有足够的耐心和时间,你完全可以一步一步,从一块砖头开始搭建起整个计算机科学的宏伟大厦。

你值得拥有!


UPDATE1:评论里提到了nandgame这个网站,一并推荐给大家。about页面有指出,灵感其实就来自于上面推荐的这本书。网站的优点是可以直接在浏览器里使用,缺点嘛,是只覆盖了本书的一小部分。

UPDATE2:看来大家对手撕计算机很感兴趣嘛。再推荐一个youtube博主Ben Eater给大家。这货最广为人知的作品,就是在一个只提供电路连接的面包板上,从逻辑门开始造出了一台8bit可编程计算机。在这个过程中,你需要自己捣鼓Latch、Flip-flop等各种电子元器件。看着他的成品,我不禁默默按了下收…啊!是点赞按钮!

好问题,我终于有机会可以推荐一套丛书了。是我们邻国的一个可爱男孩纸写的,主要先强推你说的这个底层知识科普。

程序是怎样跑起来的 (豆瓣)​book.douban.com/subject/26365491/

作者 [日] 矢泽久雄 是个来自日本的可爱小哥哥。还有这个系列其他一些

网络是怎样连接的 (豆瓣)​book.douban.com/subject/26941639/
图解TCP/IP(第5版) (豆瓣)​book.douban.com/subject/24737674/
图解HTTP (豆瓣)​book.douban.com/subject/25863515/
图解网络硬件 (豆瓣)​book.douban.com/subject/25919428/

这些书看起来非常有趣,而且没什么特别难懂的。如果有!那就先跳过,这类基础读物嘛,知道个大概就可以了。

然后我看题主像软硬件结合?那我还推荐你实操很强的“自制”系列

图灵程序设计丛书·自制系列​book.douban.com/series/34137

这里面包含了 我最喜欢的

30天自制操作系统 (豆瓣)​book.douban.com/subject/11530329/

当然其他自制CPU,自制脚本语言,自制编译器,自制搜索引擎也都是很好的。

因为考虑到题主不是计算机专业的,所以没有推教科书中的经典书籍。那些书不是一般人愿意看下来的,或者说深入看一本大概就是半年没了…我推荐的这些除了实操,其他只要耐心看完就可以了 。

感谢您阅读了我的回答,谢谢。祝您一切顺利。

没有一本书或者几本书能把这整套东西讲清楚的。

如果非要找的话,那么整个计算机专业的本科的全部课程可以把这些东西全讲一遍。全凭个人兴趣的话,那么需要非常非常漫长的时间才能搞清楚全部。而且这其中有大量的实践性的内容,软件的还好,硬件的难道要自己从门电路开始做起?需要付出的成本太高了。

个人学习的话,不建议从底层开始学起,因为底层的东西是非常无聊的,而且实际应用中也真的很难用得上。

如果按照题主的需求,那么学习次序是:

1. 基础数学和基础物理
2. 模拟电路 + 微积分
3. 数字电路 + 离散数学
4. 汇编语言 + 计算机组成原理与接口技术
5. 操作系统(理论)+ 算法导论
6. C语言 + 编译原理(选)
7. 嵌入式系统(实践) 或 操作系统(实践)

但实际教学中,C语言可能比模电或者操作系统要早一些学,因为空泛的操作系统、模电是非常不直观的,学了也不知道有什么意义,C语言是看得见摸得着的东西。

数字电路的逻辑性更强一些。如果只是看书,仍然不合适,数字电路要专门配合相关的实验,比如用74电路做一个加法器,这样会很直观的理解数字电路的逻辑。

对实验要求更高的是计算机组成原理和接口技术,类似于:一个加法器怎么变成一个CPU的?CPU里的微指令到底是怎么构造出来的?操作一个IO总线,怎么反应到硬件信号上的。这些需要对应的开发板,有些开发板很贵的。

这些东西看书可以学,甚至能学会,但不一定有直观的理解。

理论上说,学完接口技术,那么硬件部分就到此为止了,就可以学习操作系统了。可实际上,学了操作系统,反而有更多不明白的地方。比如:锁在操作系统层面上是怎么实现的?在CPU层面上又是怎么实现的?然后你就会发现,原来学的这套东西完全没有用。

这个时候,你再翻书,发现书上根本没讲这些实现细节,甚至在普通的大学里,老师都不一定能把这些问题说清楚。这个时候,你就不得不去从事相关的行业,真正去拿板子,调试Linux,研究内核实现,翻几千页上万页的CPU手册,在其中的某一两页里找到你想要的答案。这种学习方式,很难维持长期的兴趣。

任何学科都是有很庞大的体系,如果仅仅是兴趣爱好,不建议完全深入了解其全貌,从中抽取一部分你喜欢的,然后深入研究一下就够了。维持一个兴趣爱好要付出很高的时间和金钱成本。

花费很多的时间和精力,最后只学会了一个加法器,可是连汇编语言的ADD指令怎么套到加法器上都没弄明白,这样的精力投入很不值得,除非真的决心从事相关行业。

有这个时间,学点Python之类的,更容易做出有成就感的东西出来。

我之前写了一篇核心点提炼版的文章,姑且先看看?

这篇主要是我看了《编码》这本书之后,按照个人理解梳理了一遍,算是把重点都提炼出来了。

没到 C 语言,不过计算机电路啥的都提了,相信看完了还是很有收获的!

正文

这个故事得从「电」开始说起。

生活中电无处不在,而它却时刻保持着神秘感,为何插上电我们的屏幕就会亮?我们的服务器就能跑?

电是如何来的?

电起源于电子的运动,我们知道一切物质都是由原子组成的,而原子又是由中子、质子和电子构成。

在某种情况下电子从原子中电离出来,这样电就产生了。

质子和电子都具有带电荷的特性,质子带正电荷、电子带负电荷。

而异电相吸,同电相斥,当质子数和电子数相等的时候是最稳定的,如果数量不平衡也会往趋于平衡的方向发展。

像雷雨天气,云层下层积累电子而云层顶层失去电子,而闪电就是大量的电子迅速从一端转移到另一端产生的结果,为了趋于平衡。

题外话: 细心的朋友可能看到这原子核质子不都合在一起了啊,不是说同电相斥嘛?这是因为有个叫强内力的玩意聚集了它们,释放核能的原子核裂变就是由强内力导致的。

相信大家都做过电池点亮灯泡的物理实验。

这其实就是电池发生化学反应,在负极产生多余的电子,然后通过回路中的原子类似接力的形式,一个原子得到电子之后会传递给相邻的另一个原子,如此循环传递电路就形成了,最终通过灯泡到达电池的正极。

改装下再套上个外壳,手电筒就这样被造出来了。

而手电筒不仅仅可以用来照明,还能用来通信。相信大家都看过类似的电影场景,我这手电筒的光闪三下咱们就上!

而说到这样简易的通信就不得不提摩尔斯电码,相信大家也从各渠道对摩尔斯电码有一定的了解,比如「星际穿越」这部贼好看的电影。

在 19 世纪初期,那时候的远距离通信还得利用马车等工具长时间运输传递,人们一直在摸索即时远距离通信的方法。那时的摩尔斯就开始埋头实验,最终发明了电报。

电报的思想和上述说的手电筒思想一样,手电筒通信的思想是通过开关来控制灯的亮暗,而电报利用的是电磁现象。

将导线缠绕在铁棒上,然后通电之后铁棒就变成了磁铁,断电了磁性又会消失,然后再搞个发声器,通过磁性来吸引可动棒敲击发声。

通电后可动棒被拉下,敲击下方就会发出 “滴” 的声音,断电则可动棒复位,敲击上方发出 “嗒” 的声音。将快速的滴答作为点,慢速的滴答作为划。

通过导线的长距离连接就能实现远距离通信,通过判别点和划的组合查阅摩尔斯电码表,转成最终的信息。

如果要双向通信,就再搞一个反过来部署就好了,这就是电报机了。

不过导线是有电阻的,导线越长电阻越大,所以是有距离限制的,不过这难不倒我们,最简单的方法就是转发一下。

在中间距离也建个电报站,然后雇一个人,得到发送方的电报信息之后,重新敲一遍发送给真正的接收方,但是这需要多余的人力,所以可以如下图所示,搞个棒子连起来带动下一个开关的输出。

这其实就是继电器原理,我们来看看继电器是如何的设计的。

下方通电产生磁力,吸引上方的金属杆挂下,然后上方形成回路因此也通电了,这样远距离传输的微弱电流就被又一次放大输出了,所以最终的远距离电报应该是这样的。

可以看到继电器这个发明是真的巧妙。

理解了上面所述的电的生成、电报以及继电器之后我们再来看看二进制。

基于二进制的数字系统是最简单的,只有 0 和 1,不能再进一步简化了,而简单就代表着清晰,就像开关要么开要么关。

而二进制的组合又可以代表多种可能,比如第一个 0 表示男,1 表示女 ,第二个 0 表示胖,1 表示瘦。

让我们再回到之前的电池电灯图中,这次搞两个开关。

可以得知两个开关都闭合电灯才会亮,如果转化成二进制表示,0 表示开关断开,1 表示开关闭合,0 表示灯泡不亮,1 表示灯泡亮,总结成一张表格的话就是:

左开关 右开关 灯泡

这其实就是我们熟知的 AND 操作,如果把电路稍微改一下就是 OR 操作了。

如果把很多开关组合起来就能执行简单的逻辑任务,但是开关需要手动的去控制。

记得之前提到的继电器吗?它也能串联或者并联电路,而且可以被其他继电器联动控制,不需要一个一个拨动,因此用继电器来组合更加合适,而继电器的组合称之为逻辑门。

简单点的就像下图所示,开关闭合灯泡就会亮。

有些人觉得这不是多次一举吗,这其实是个缓冲器,可以延迟信号,也可以放大信号,而且这个电路比较简单,实际上有很多组合,比如下图的这个反向操作,开关闭合的灯反而不会亮。

还有像这样的串联组合,只有两个开关都闭合灯泡才会亮。

当然这里的输入不一定得是开关,输出也不一定得是灯泡,只是为了更加直观的表现出来,不过这样画电路太麻烦了,于是电气工程师们就搞了个符号来表示这些电路,比如上面的串联其实就是 AND 操作,是与门。

简化一下上面的图就变成下面的样子。

如果电路图如下所示,就是并联,随便一个开关开了灯泡都会亮,这就是或门。

简化符号是这样的:

前面还提到个反向操作的,开关闭上灯泡反而不亮的叫反向器,符号如下图所示。

我们再来看看这样的电路。

只有当两个开关都断开的情况下灯泡才会亮,任何一个开关闭合灯泡都会熄灭,这个操作和 OR 操作相反,称之为 NOR 即或非门,简化后的符号比或门多了个小圆圈,代表反向。

或者这样,组合着画也一样。

然后我们再来看看这种电路,只有两个开关都闭合才会熄灭,这和与门正好相反,称之为 NAND 与非门。

简化符号是这样的,也是多了个圆圈:

我再总结一下这几个简化图,加深一下印象。

二进制加法机

有了上面这几样东西,我们就可以造个二进制加法机,不要小看加法,因为可以用加法来实现减法、乘法、除法等操作。

加法我们知道会得到当前的和、进位这两个信息,例如二进制中 1 + 1,当前和是 0 ,进位 1。

进位 0 1

可以看到只有 1 +1 进位 1 ,再仔细看看是不是和 AND 操作很像?只有 1 AND 1 结果才为1 。

AND 0 1

我们再来看看当前和的计算

和 0 1

大家可以在脑子里面想象下,如果拿 OR 操作来套用的话右下角结果不对,如果是 NAND 操作的话左上角结果不对,所以得两个结合一下,电路图如下。

分别通过或门和与非门之后再做与门,出来的结果就是当前和的结果,这个其实就是 XOR 异或门,简化表示就是:

所以加法需要通过两个逻辑门,分别是异或门来操作当前和,与门来操作进位,结合起来如下图所示:

这其实就是个半加器,简化的图如下所示:

那为什么叫半加器?因为只能一位一位的加,而前一位的进位参与不到下一位的计算,如果要加入进位那下一位的运行就是 A 的当前位 + B 的当前位 + A 和 B 之前的进位。

因此需要改装一下,两个半加器合起来再加一个或门。

假设 A 输入 1 , B 输入 1, 进位输入 1,从最左边开始第一个半加器 S 输出 0 , CO 输出 1,第二个半加器 S输出 1,CO 输出 0,最终和输出 1,进位输出 1,结果没毛病可行,这叫全加器,简化一下图:

全加器有了,咱们得组合起来,并且需要有输入和输出,我们通过开关来输入数字,由灯泡的亮暗显示结果。

这就是一个 8 位的计算器,有 9 个灯是因为两个 8 位相加结果可能是 9 位。

然后从最右边开始如下图所示接上全加器,进位接地表示 0 输入

中间的都如下接法,前一个的进位输出是下一位的进位输入。

最后一个就是把进位输出直接接到第九个灯上就行了。

此时你摆动控制面板的开关,就可以通过机器得到相加的结果。简化的画法如下图所示:

现在我们已经造出了八位加法器了,如果要 16 位呢?简单合一下就好了。

当然真实的计算机原理差不多是这样的,不过会更复杂,比如不会像我们的加法器,一个一个的进位加,而是会先行进位,而且也不会用继电器,而是晶体管等等。

减法怎么弄?

加法器我们搞出来了,那减法怎么做?减法需要有借位操作。

我们先拿熟悉的十进制来说。假设你的账户上限是499,你的透支额度是500,也就是说你的账户金额范围是 -500~499 这 1000 个数字,要求不能用负号来表示。

可以看到这是个三位数,而最大值就到 499 过,说明 500~999 之间的数没用,那拿来表示负数不就刚刚好吗?

所以让 500 表示 – 500 ,501 表示 -499,以此类推。

500,501.......998,999,000,001......498,499,让5、6、7、8、9开头的数都代表负数,而且是不是看起来还形成了个环形, 499 + 1 就变成 500 了,然后 999 + 1 变成 1000 ,但是只能三位数表示,所以溢出了变成 000。

这种处理叫 10 的补数,如果要把三位负数转为 10 的补数,就是让 999 减去它再加一,也就是说 10 的补数等于 9 的补数加一。

补数的概念:拿 9 的补数来说,将一个数从一串 9 中减去得到的结果就叫这个数 9 的补数,比如 123 ,它是三位数 ,999-123 = 876 所以 123 的 9 的补数就是 876,如果把结果 + 1那就是 10 的补数了。

就拿 -499 来说,我们要转化成补数,就是 999 - 499 + 1 等于 501 ,看上面的排列确实用 501 来代表 – 499。

那减去一个数不就是加上一个数的负数吗?所以通过补数我们就不需要做减法,只需要转成补数再相加就行了!

现在我们再换成二进制,二进制相比于十进制就更简单了。

拿八位二进制数来说,范围是 00000000~11111111, 对应的十进制是 0~255,但现在我们想让它能表示负数,前面十进制的时候我们将 5、6、7、8、9开头的正数来表示负数,对应于二进制我们可以将第一位以1开头的作为负数。

那此时的范围就是:

如果你理解了上面的十进制转化,这个二进制肯定是没问题的,这其实就是算出 2 的补数,而 2 的补数又是 1 的补数 +1。

我们拿 125 来举个例子,125 二进制表示是 01111101,求 1 的补数就是 11111111 - 01111101,这个减法在二进制中不需要,因为这其实就是求反,还记得上文提到的反向器吗?

取反了之后再加一,就得到 2 的补码。

所以 -125 就是 10000011。

当然这一切的前提都是数字的位数需要固定,所以计算机中的位数就是固定的,超出了就会溢出,到这里你应该可以理解计算机中的补码是怎么来的,而且理解了为什么最大值 +1会变成最小值?

所以减法我们只需要改造一下上面的加法器,给个开关表示要这个数是负数,如果是负数则进行一波反向器操作然后再 +1,之后再进行加法操作即可得到最终的结果。

乘法和除法我就不分析了,一样也能通过加减法来实现。

振荡器(时钟)、锁存器(触发器)和计数器

当然这个和我们所认识的计算机还差很多,现在只能进行一些非常简陋的加减操作,别急我们先来看看这个电路。

这个电路很有意思,当你闭合开关的时候电路通了,此时由于电磁效应可动棒被吸了下来,电路就断了,断了之后磁性消失了可动棒又移了上去,这样电路又通了,如此往复。

这种电路叫振荡器,这是一个很关键的东西,记住它。

它的来回振荡其实就是在输出 0 和 1 的交替序列,画成图如下所示:

随着时间的变化在 0 和 1之间交替变化,因此也称之为时钟。

一个变化循环所需要的时间称之为周期,频率是周期的倒数,如果周期是 0.05 秒,那么频率就是 20,每秒 20 个循环,用赫兹来作其单位,所以就是 20 Hz。

我们再来看下这个电路。

此时灯泡是不亮的。当上面的开关闭合后,左边的或非门输出 0 ,右边的或非门输出是 1,因此灯泡亮了。 神奇的地方来了,此时你断开上面的开关,灯泡依然是亮的,因为左边的或非门输出还是 0,而或非门只要有一个输入是 1,输出就是 0 。

此时如果闭合下面的开关,灯泡就会熄灭,再断开下面的开关灯泡仍旧不亮。

可以看到这个电路是有记忆功能的,你看如果你发现此时的灯泡是亮的,你就能推断上一次闭合的是上面的开关,如果此时灯泡是暗的那么上次闭合的就是下面的开关!

这种电路叫触发器,其实上面的开关就等于置位(set),下面的开关等于复位(Reset),所以这也叫 R-S触发器。

不过更有用的电路应该能记住某个特定时间点的上上一个信号是 0 是 1。

所以还需要搞个保持位,使得保持位关了之后,上下两个开关随意拨动都不影响之前保持结果(下面的图复位和置位位置和我们电路图是相反了,不过没影响一样的)。

其实就是当保持位 0 的时候,复位和置位通过与门的输出肯定是 0 根本影响不到之前的结果。

但是这样就有三位输入了,比较麻烦。从上面的观察来看有意义的输入其实是上面开下面关,或者上面关下面开,所以一定是相反的。所以搞个反向器这样就只有两个输入了。

这个叫电平触发的D型触发器,D表示 Data,数据的输入。电平触发就是当保持位为某一个特定电平时 (例子是 1),触发器就会保存数据端的输入值。

理解了保持位之后,我们需要引入时钟(标志为 clk),一个有规律的来回变化的时钟,当时钟从 1 切换到 0 的时候上一次操作的内容就被保存了,所以把保持位的输入替换成时钟输入。

这样的电路叫做电平触发的D型锁存器,它表示电路锁存住一位数据,并保持到将来使用,它也称之为 1 位存储器。

有了 1 位存储器,那多位存储器就很简单了,就是将多个锁存器合在一起,如下图是八位锁存器。

这里还需要提一下边沿触发器,不同于电平触发器的是边沿触发器是在 0 变成 1 的瞬间记录结果,像电平触发器是在 1 的时候每个结果都会被覆盖性的记住,在某些场景下边沿触发器的瞬时性更合适。

电路图如下,由两级 R-S 触发器链接而成,其实这种电路看不的很乱觉得很复杂没事,知道结果就行了。

简化的画法如下:

然后我们再来看下这个电路:

将振荡器的输出作为时钟的输入,然后反向 Q 端(上图中下面的Q代表反向Q,图少了一横)的输入又作为 D 的输入。

出来的波形图是这样的,可以看到 Q 的输出频率是时钟的一半,所以这种电路称为分频器。

而分频器的输出又可以是下一个分频器的输入,我们再来看下这个图:

出来的波形图是这样的:

再填上 0 和 1:

从 Q3 开始每一列从下往上看,是不是 0000、0001、0010…. 这就是计数器,把 8 个集成一下放在黑盒中,就构成了 8 位的计数器。

当然这个计数器是异步的,后面的得等前面的通知,比较不准确,所以更好的是同步计数器,不过比较复杂,这里就不介绍了。

简单组装一下

至此我们已经有了加法器、振荡器(时钟)、锁存器(触发器)和计数器,接下来我们就开始组装一下它们。

比如现在我们有一个灯泡,想测试一下八个锁存器,八个锁存器的话那么需要 3 个开关来表示具体选择哪个锁存器,2 的 3 次方等于8。

中间的黑盒肯定是拿来选择的,通过开关来控制通路,比较复杂我觉得稍微看看就行,反正就是电路选择。

输入的话也不用直接用八个,所以也搞个三个开关。

内部构造我就不贴了,也和选择器一样复杂,这叫译码器,最终完整电路图如下:

而是S0、S1、S2 其实就是地址,通过地址来选择写入哪个锁存器中,并且对应输出结果,这种配置叫读/写存储器,也称为随机访问存储器即 RAM。

因为它能保存信息,所以叫存储器,因为能根据地址选择来写入读取所以是随机。

上图电路简化图如下,能存储 8 个独立的 1 位数据。

两个 8*1 RAM 结合一下就能表示存储 8 个独立的 2 位数据。

如果是通过下面这样的组合,则能表示 16*1 RAM,那个 DI 其实就是第四根地址线,所以是 2 的 4 次方。

可以看到 RAM 阵列的存储容量等于 2 的地址数次方,然后注意下我们图是简化了的,里面其实有很多继电器的,像逻辑门都是由继电器构成的,当断电之后电磁效应就没了,所有的触点都回归原样,这就是 RAM 为什么是易失性存储介质的原因。

咱们现在已经把内存给搞出来了。

接下来我们的目标就是把要计算的数据输入内存中,然后让加法器计算了之后把结果写回内存,并且可以再通过内存查看结果,大致的组装样子如下:

然后我们可以将加法器和锁存器结合起来作为一个累加器,即每次加法的值存储到锁存器中并作为下一次累加的值。

有了累加器之后,我们可以将存储器的值传到累加器中,称为 Load 装载,把下一个值添加到累加器中,称为 Add,然后将结果保存在某个位置,称为 Store。

可以通过控制面板先往存储器里面写好要操作的值并且可以通过控制面板上的灯来查看内存写入结果,然后一开始访问存储器的地址为 0000,由计数器来驱动地址的前进,然后进行相加,最终将结果存储回 RAM 阵列中,当然也需要设置停止信号。

把我们前面定义的 Load 等操作码,转化为特定的代码来控制整体的流程(你就认为这代码会指示电路做某种操作,没必要细想反正就是通过逻辑门组合产生的)。

这个操作码仅是个助记符,因为地址是固定的,并且操作码指令字节是固定长度(1个字节),所以我们可以在每条操作后面跟上地址,总的而言每条指令(除停止)需要 3 个字节。

简单的看下图,就是在存储器地址0000处存入以下“代码”。

并且可以搞个 Jump 指令用来跳转地址,可以通过设置计数器来达成跳转地址的功能,有了跳转我们就能做循环操作了。某些重复的指令只需要编写一次,通过条件跳转来完成循环,最终的组装示意图如下:

2-1 选择器是切换计数器的地址输入或者是计算得出的输入,通过三个 8 位锁存器来分别代表代码,地址高位和低位,上图来看可能有点绕,不理解细节也没有关系,大致的流程还是简单的。

至此我们其实已经组装了一台计算机了,之所以能叫计算机而不是计算器是因为它可以根据你写入存储器的指令自动取指执行,并且可以进行条件跳转和循环执行自动停止。

计算机的处理器就是我们上面的累加器,可以称之为算数逻辑单元,即 ALU。

那个计数器就是我们的程序计数器PC。

存储器就是内存了,输入就是控制面板,输出就是控制面板上的灯。

计算机几个核心模块就都有了。

至于前面我们定义的操作码其实就是机器语言,而人类为了好记就会搞一些助记符来标识,发展到后来就是汇编语言,而汇编语言又太麻烦了,因此又抽象搞了高级语言,比如 C、Java 等等。

最后

这篇文章最终所描述的计算机其实是相当简陋的,真正的计算机也肯定不会这样造的,比如不会用继电器,线路也会用各种总线啥的搭建起来各种集成电路等等,ALU 也不会如此简单,会有各种并行计算等等。

主要是想借此大致的说下计算机基本的运行原理和构成,因为本质上的道理是一样的。如果要我把很多细节都说出来我也不会,我也就懂一点点点点皮毛,我也不是搞硬件的,啥模电的课我也没上过,我就会装装机的水准。

本文大量借助了《编码的奥义》一书的例子,或者说是对此书一些章节的梳理和总结,如果对原文有兴趣的可以自己购买书籍。


手打不易,如果觉得回答不错,来个赞呀~也欢迎关注

其他回答说的挺好的,很多是动手操作层面的书籍,或者是嵌入式的硬件环境,或者是虚拟机之类的。

但是我仔细一看,楼主是数学系大三,抽象和推理能力应该很强。可以”高举高打“啊!毕竟数学是科学和工程的普适语言,计算机专业的很多东西估计在数学大神看来只是“应用数学”或者“工程数学”之一。

如果楼主不是想换专业,不忙着找计算机方面的工作,数学书看累了,作为放松不妨可以看看这几本(可能太“阳春白雪”了),即可以摸清计算机底层的逻辑本质,而且不用花钱买开发板之类的。

由于我是Lisp粉丝,因此稍微夹带私货:)

1.《计算机科学的逻辑基础》,国内刚翻译出版。

这本书使用了基于Lisp语言的逻辑证明工具ACL2(官网如下)

ACL2 Version 8.3​http://www.cs.utexas.edu/users/moore/acl2/

作为数学系的楼主,对形式证明应该得心应手。这本书利用ACL2这个工具,对计算机算术、数字电路(加法器和乘法器之类)的设计及其性质,进行了严格的逻辑验证。

如果楼主嫌这个太low,到ACL2官网,还有更多硬件验证的例子。

比如X86的指令集分析

X86ISA – Introduction​http://www.cs.utexas.edu/users/moore/acl2/manuals/current/manual/index-seo.php/X86ISA____INTRODUCTION

还有在ACL2中形式化jvm虚拟机的课程

COSC5010: Formalizing the JVM in ACL2​http://www.cs.uwyo.edu/~cowles/jvm-acl2/

2. 《计算机程序的构造和解释》,大名鼎鼎的SICP

计算机程序的构造和解释(原书第2版) (豆瓣)​book.douban.com/subject/1148282/

这本书大部分人觉得就是讲Lisp/Scheme编程,或者利用Lisp/Scheme讲编程思想。但是别忘了这本书曾经是MIT的电子和计算机工程系的一年级教材,好多电子工程和计算机底层模型作为例子,作者写着写着,就写成了一本自底向上“搭积木”式的计算机系统构造指南。

摘录一些特别精彩的章节例子:

3.3.4 数字电路的模拟器 (以这个为基础,你可以实现一个计算机体系结构的仿真模型)

3.5.3 流计算模式的使用 (这里居然用模拟电路和信号处理系统的仿真做例子)

第4章实现了Lisp的元解释器。

第5章 寄存器机器里的计算 (这章的节奏绝对是“疯狂”的,5.1先实现了玩具性质的“高层次”硬件描述语言,5.4用这个语言搞出一个Lisp机器, 5.5为这个机器提供编译程序)

这本书具有国内教材难以企及的大局观和磅礴气势,有一种高屋建瓴之美! 让你从理论上搞清楚了计算机是从底层一步步怎么来的,软件/硬件如何协同,确实不愧是一本“神作”。

3.《汇编语言与计算机体系结构》,一本默默无闻的老教科书,从来没火过

汇编语言与计算机体系结构 (豆瓣)​book.douban.com/subject/1705742/

为什么推荐这本? 因为看到楼主想学C++,这本书会告诉你C++的语法构造如何在底层机器上实现。采取的也是很诡异的手法,软硬件协同”试错“的方法。

先设计一个虚拟机,搞一个指令集,可以支持一些语法构造了。但是有些语法构造支持比较难,那就持续的扩充指令集,改造虚拟机,设计逐步迭代,直到最终可以支持所有核心构造。

虚拟机模拟的是”微程序“的体系结构,严重怀疑作者是上个世纪70-80年代设计计算机的,颇有那个年代之气质。

谢谢邀请

双非渣渣,自学八个月C++,毕业后顺利进入字节跳动,现在正在写代码…摸鱼期间来写个回答。。

先简单聊一下电路-》汇编-》C语言,再谈一下C++的学习吧

第一个问题

一本书直接打通关,电路-》汇编-》C语言,我还没见过哪本书这么全的。

不过虽然是个渣渣,但好歹也学了八九年的计算机,现在也在字节跳动写代码,也看过不少的书,倒是知道有两条路可以办到,分别是是三本书和一个网站。

不,严格意义上说应该是三本书、两个视频和一个网站

阿秀自己经历了2021届的互联网秋招,在面试的过程中,被问过各种各样的问题,但是大部分都是基础性的题,所以基本功很重要,也很关键。

在我以前通过校招上岸字节跳动后,将自己的秋招找工作笔记开源在github上了。

可以说我能够凭借双非的学历进入字节跳动全靠我自己总结的这份笔记,后来我将这份笔记制作成了PDF,并且同步到了自己的校招学习网站上,现在免费分享给学习学妹们!

自己以前的学习笔记包括操作系统、计算机网络、数据库(MySQL、Redis)、常见情景题、智力题以及计算机面试中需要注意的问题。

下面是我的校招学习笔记网站内容大纲

《阿秀的校招学习笔记》网站内容大纲
《阿秀的校招学习笔记》网站内容大纲

不少学弟学妹们在这个网站的帮助下,顺利进入BAT、TMD,甚至去了字节跟阿秀一起做同事,都跑来找我报喜!

这是我的学习笔记网站,不说了,校招党必须要冲一波:

《阿秀的校招学习笔记》网站​interviewguide.cn/notes/01-guide/web-guide-reading.html​interviewguide.cn/notes/01-guide/web-guide-reading.html​interviewguide.cn/notes/01-guide/web-guide-reading.htm​interviewguide.cn/notes/01-guide/web-guide-reading.html

第一、三本书和两个视频

1、电路篇

书中有一段原文说得很好

“虽然莫尔斯电码和计算机毫无关系,但是,熟悉编码的本质对于深入理解计算机软硬件内部结构以及隐匿在其后的语言将大有裨益。 编码就是交流。 大部分编码必须易于理解,因为它们是人类交流的基础。 你可以说英语词汇就是一种编码。 我们发出的声音所形成的词语是一种可以识别的编码。我们将这个编码称为“口头话语(the spoken word)”或“言辞(speech)”。对于写在纸上(或刻在石头上、木头上、或者在空气中比划)的词,我们叫它“书面语言(the written word)”或者“文本(text)”。”

这本书讲得很有趣,教你在做游戏的同时带你领略一下计算机硬件背后的秘密。

如果想要购买纸质版的话可以去JD或者当当购买,均有售。

如果想要PDF电子本,则可以看下这个计算机经典书籍的仓库,里面有不少书籍,比如

地址如下:

GitHub – forthespada/CS-Books: 超过1000本的计算机经典书籍、个人笔记资料以及本人在各平台发表文章中所涉及的资源等。书籍资源包括C/C++、Java、Python、Go语言、数据结构与算法、操作系统、后端架构、计算机系统知识、数据库、计算机网络、设计模式、前端、汇编以及校招社招各种面经~​github.com/forthespada/CS-Books

2、汇编篇

王爽老师的汇编语言是我看过讲汇编最好的一本书了,那些寄存器的概念原本跟天书一样,王爽老师在这本书里把他们讲的那么透彻…

对了,B站还有对应的视频可以让你跟着做实验,相当不错了。

我在以前看的时候就觉得讲的非常不错,用视频的形式让你看清内存申请、写入的过程。

这个视频对新手比较友好,视频地址如下:

汇编语言从0开始 重制版 自学必备(配套王爽汇编语言第三版或第四版)_哔哩哔哩_bilibili​http://www.bilibili.com/video/BV1mt411R7Xv

3、C语言篇

如果你让我推荐C语言的学习资料和视频,我只会推荐这个视频。

视频:

郝斌老师是瑞德学校担任教学组长,曾在雅博等公司担任项目总监。 6年开发经验,擅长C/C++ 、Java、 数据结构、数据库,他的C语言教程在B站上有超过470W的播放量。

这个视频用来入门十分不错了,视频下方也有对应的课件

地址:

《郝斌C语言自学教程》_哔哩哔哩_bilibili​http://www.bilibili.com/video/BV1os411h77o?from=search&seid=14324235140821866242

其实C语言的经典书籍有很多,如果你只是想入个门的话,这个视频就够了。

不过C语言的指针是灵魂所在,如果你想要学好C语言的话,指针一定不要放过,学好了指针才有资格说一句掌握了C语言。

下面这三本书可以酌情考虑看一下:

答应我,把你手中的谭浩强C语言放一边好吗….

推荐指数:四颗星★★★★

书名:征服C指针

理由:C语言最为核心的点莫过于指针了,在一些大型项目里指针经常指来指去,多重指针容易弄得一些小白云里雾里不知所云,这本书是讲指针的经典书籍,阿秀学长学习完后重新认识了指针,看完再不懂指针可以来揍阿秀学长。

推荐指数:五颗星★★★★★

书名:C陷阱和缺陷

理由:这里搬运一段百度百科上的介绍和说明:“本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。全书分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议。本书适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备书籍。”,从这段介绍中就可以感受到这本书的分量了。

除此之外,还有一些比较优秀的书籍,如果你想要走C/C++开发的路线,这些书籍都是十分不错的资料。

推荐指数:五颗星★★★★★

书名:C和指针

理由:指针方面的经典好书,这个不需要再讲了。

当然了,如果你想要购买纸质版的话可以去JD或者当当购买,均有售。

如果想要PDF电子本,则可以看下这个计算机经典书籍的仓库,里面有不少书籍:

GitHub – forthespada/CS-Books: 超过1000本的计算机经典书籍、个人笔记资料以及本人在各平台发表文章中所涉及的资源等。书籍资源包括C/C++、Java、Python、Go语言、数据结构与算法、操作系统、后端架构、计算机系统知识、数据库、计算机网络、设计模式、前端、汇编以及校招社招各种面经~​github.com/forthespada/CS-Books

第二、一个网站

这个网站是我自己私藏的一站式学习Linux的网站,内容相当的全面,从入门到入土的那种全面。。。。

网站地址如下:

Linux C编程一站式学习​docs.linuxtone.org/ebooks/C&CPP/c/index.html


第二个问题

看到楼主说想学一下C++,那我更有发言权了

下面这是我的C++学习路线和秋招总结,相信会对楼主有所帮助和提示的。

不好,我不能写了,再写就要被主管发现摸鱼了。。。干活去了,答主自己移步看吧。

推荐一下最后两篇文章,是我的总结题型和开源的秋招笔记…溜了溜了溜了。

拓跋阿秀:2021年秋招|双非C++渣硕的我是如何拿到抖音研发岗SP的?195 赞同 · 34 评论文章
拓跋阿秀:能拿BAT、TMD等国内互联网大厂的C++学习过程分享~24 赞同 · 7 评论文章
拓跋阿秀:快收藏!互联网校招面试超高频13道经典手撕算法题及答案解析20 赞同 · 8 评论文章
拓跋阿秀:2021届校招技术研发岗知识点总结&网站121 赞同 · 9 评论文章

对了,还有双击屏幕有惊喜哦。我是@阿秀学长, 开源项目:Interviewguide维护者,日常分享计算机编程学习、校招等知识,如果我的回答对你有帮助,帮我点个赞就是最大的支持了!

感谢~

虽然没有一本书籍可以实现,你说要求的所有知识,但是在计算机领域传说中的黑皮书,绝对可以满足你所有的需求。

并且这些书籍在豆瓣的评分,几乎都是9.x 以上,可以说是经过了千千万万程序员的验证,如果你想学习计算机底层技术,鼎力推荐。

1、处于绝对排名第一段神书就是:《深入理解计算机系统》,豆瓣评分9.7.

本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。

全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。

书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。

2、排名第二:《算法导论》

这本书深入浅出,全面地介绍了计算机算法。

对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。

涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。

此书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。

3、排名第三的是:《C程序设计语言》

在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用广泛。

本书作者是C语言的设计者之一Dennis M. Ritchie和著名计算机科学家Brian W. Kernighan合著的一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。 原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。

人们熟知的“hello,World”程序就是由本书首次引入的,现在,这一程序已经成为众多程序设计语言入门的第一课。原著第2版根据1987年制定的ANSIC标准做了适当的修订.引入了最新的语言形式,并增加了新的示例,通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各个特性以及程序设计的基本方法。

对于计算机从业人员来说,本书是一本必读的程序设计语言方面的参考书。

4、排名第四的是:《计算机程序的构造和解释》

《计算机程序的构造和解释》成型于美国麻省理工学院(MIT)多年使用的一本教材,1984年出版,1996年修订为第二版。在过去的二十多年里,该书对于计算机科学的教育计划产生了深刻的影响。

5、排名第五的是:《UNIX环境高级编程》

本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。

书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用示例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附录中给出了函数原型和部分习题的答案。

本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX程序员都是一本不可或缺的参考书

6、排名第六的是:《代码大全》

著名IT畅销书作者史蒂夫·迈克康奈尔11年前的经典著作的全新演绎。

这本书中所论述的技术不仅填补了初级与高级编程技术之间的空白,而且也为程序员们提供了一个有关编程技巧的信息来源。

这本书对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生们都是大有裨益的。可以说,无论是什么背景的读者,阅读这本书都有助于在更短的时间内、更容易地写出更好的程序。

这里提到的电子书,大部分都包含在我整理的一份电子书中,目前将这些资料汇总都打包放在这了,点击下方链接直达获取:

戳这里,直接获取:

计算机必看经典书单​mp.weixin.qq.com/s/tE01TkvkzyzyH40lkUhC0w

7、排名第七的是:《编码》

本书讲述的是计算机工作原理。作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。

更重要的是,你会因此而获得对计算机工作原理较深刻的理解。这种理解不是抽象层面上的,而是具有一定深度的。

8、排名第八的是:《UNIX网络编程》

本书是一部UNIX网络编程的经典之作。

书中全面深入地介绍了如何使用套接字API进行网络编程。全书不但介绍了基本编程内容,还涵盖了与套接字编程相关的高级主题,对于客户/服务器程序的各种设计方法也作了完整的探讨,最后还深入分析了流这种设备驱动机制。

9、排名第九的是:《C++ Primer 中文版》

这本久负盛名的 C++ 经典教程。

除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委员会原负责人 Josée Lajoie 对C++标准的深入理解。

书中丰富的教学辅助内容、醒目的知识点提示,以及精心组织的编程示范,让这本书在 C++ 领域的权威地位更加不可动摇。无论是初学者入门,或是中、高级程序员提升,本书均为不容置疑的首选。

10、排名第九的是:《设计模式》

这本书结合设计实作例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。此书适合大学计算机专业的学生、研究生及相关人员参考。

书中涉及的设计模式并不描述新的或未经证实的设计,只收录了那些在不同系统中多次使用过的成功设计。

最后,这里再给大家推荐一个程序员学习网站,可以说涉及到程序员的方方面面的资源都有,使用了的朋友都说,只恨没有早点发现这个网站:

程序员导航-书籍推荐

程序员导航-CXY521​cxy521.com/

其中有一个 书籍板块,收集了各个领域内最优秀的计算机书籍,对于程序员看书参考来讲,急具推荐性!

@纯洁的微笑

看到这里的朋友请帮忙点个赞,也可以关注我的知乎,一个有故事的程序员。

这个想法非常好:想从最底层开始了解计算机,一边实践一边学,把软件和硬件打通,交融在一起。

但我不建议这样学习计算机。

如果你要学习物理,我推荐你顺着物理的发展史学习,先学习牛顿的经典物理,再学习热力学、电磁学,然后学习相对论、量子力学这些彻底推翻经典物理的,最后学习电动力学这种硬核的。

整个学习过程,是自底向上的。但是学计算机,这样行不通的。

先学习电路,然后学习冯诺依曼结构,造一台计算机?接着再学习如何用汇编写个 mini os?接着学习如何写一个简易版的编译器?最后再学习编程语言,比如说 C 语言、Java、Python、C++?

这样学习起来会非常痛苦,尤其是对非科班的你来说,哪怕是你能力再强,方法不得当,学起来只会事倍功半。

计算机的学习最好是自顶向下。

无论怎样,你都不一样先从电路开始学起,再学习 C语言,然后再学习 C++。

我的建议是,你应该先从 C语言开始学起。

在整个计算机知识体系中,C语言起到了承上启下的作用,向上可以学习应用层级的的编程语言,比如说 Java、C++、Python 等;向下可以学习汇编语言,以及计算机硬件层级的内容,比如说 CPU、内存这些。

C 语言怎么学习呢?

首推浙大翁恺教授的 C语言课,共两门。

程序设计入门–C语言_浙江大学_中国大学MOOC(慕课)​http://www.icourse163.org/course/ZJU-199001?from=searchPage
C语言程序设计进阶_浙江大学_中国大学MOOC(慕课)​http://www.icourse163.org/course/ZJU-200001?from=searchPage

看过的都说好。有了 C语言的基础后,你可以看看我们邻国一个可爱男孩写的这一套丛书。

先从《程序是怎样跑起来的》这本书开始阅读吧。

这本书从计算机的内部结构开始讲起,讲解了二进制、内存、汇编语言、硬件控制等硬核内容,图文并茂,通俗易懂,算是一本“计算机组成原理”的图解趣味版。

还有:

这些书都配套了大量的图片,阅读起来轻松惬意,等有了这些书作为基础后,再学习计算机的其他任何知识都不会感觉太枯燥。

然后再读一读《深入理解计算机系统》、《操作系统原理》、《现代操作系统》、《计算机系统概论》,你就对整个计算机的底层知识有一个很清晰的脉络了。

读完这些计算机经典书籍后,我飘了!​mp.weixin.qq.com/s/qwUtTbfDB36VSwnjMRakqA

《深入理解计算机系统》这本书无愧于它的名字,提供了一个程序员角度认识计算机的最基本的知识框架。通过这本书为接下来更深入的诸如操作系统、编译原理、计算机组成原理等主干课程的学习打下了坚实的基础。

当然了学习这本书并不容易,可以参考我之前的这篇回答:如何阅读《深入理解计算机系统》这本书?

完事后,直接看这本书吧:30天自制操作系统。

30天自制操作系统 (豆瓣)​book.douban.com/subject/11530329/

自己编写一个操作系统,计算机的构造、汇编语言、C语言等,都有了实战的机会。你就把硬件和软件打通了。

对 C++ 感兴趣的话,完全可以看看这些书:

对 C++ 感兴趣的同学应该帮助很大,获取方式:计算机必读经典书单

书不在多,而在精,希望题主能找打几本自己感兴趣的,深入研究下去,希望学有所成后来卷计算机专业哟。

感谢您阅读了我

的回答,谢谢,祝您一切顺利。

没啥好说的,必须安利 CrashCourse 的视频课,从逻辑门一层一层抽象,一直讲到人工智能与计算机的未来畅想。并且因为是一层一层的抽象,所以即使你自己的知识树没有深入到很基础的知识也无所谓,从中间开始就可以了,也可以看得懂。

每个视频也就十分钟出头,但是确实用一种最深入浅出的方式把一个层级的知识做了最简单易懂的介绍。整个视频课看下来也花不了太多时间,却能对计算机基础知识有最全面的认知。

【【计算机科学速成课】[40集全/精校] – Crash Course Computer Science-哔哩哔哩】b23.tv/8jRnOlj

但是!

知识的深度与广度是两个方向,这个视频课着重把计算机涉及知识点的每个层级与各层级的联系都做一个全面的介绍,让你懂得整个计算机大厦是怎么由一砖一瓦搭建起来的。

不过要想深入的了解这一砖一瓦是怎么设计的,不同的应用中有哪些优化点,又有什么坑,还是必须回到每个层级的知识本身,最好就是去看每个层级对应的网评很好的大学教材。看这个视频的好处就是让你知道你的知识在哪个层级,知道你的知识与你想了解的知识中间由哪些知识构成,可以对应的去详细的学习。

《数字电路》《数据结构》《计算机组成原理》《操作系统》《计算机网络》……

计算机是一门偏实操的科学,学习过程中不要只看书,敲几行代码、跑几个仿真能让你印象与理解更深。

甚至你可以了解得更细

学习《模拟电路》,了解搭建逻辑门的半导体器件的特性为什么是那样的

学习《半导体物理》,从电子的角度去理解半导体特性

学习《固体物理》,从能级的角度去理解电子特性

学习《量子力学》,从势阱的角度去理解能级

计算机底层的原理很复杂,能够把这些复杂的知识用准确,生动,通俗易懂,且具备可操作性的方式写成文字的作者真的很了不起,而我这就有几本这样的书推荐给大家。

它们分别是:

编码 (豆瓣)​book.douban.com/subject/4822685/

汇编语言(第2版) (豆瓣)​book.douban.com/subject/3037562/
30天自制操作系统 (豆瓣)​book.douban.com/subject/11530329/

下面对这几本书做简单的介绍。

《编码-隐匿在计算机软硬件背后的语言》

《编码-隐匿在计算机软硬件背后的语言》这本书是偏向数字电路的,从硬件这一层面讲解了一些基本电子元器件的工作方式,比如8位加法器,触发器,锁存器等等,然后再进一步将这些电子元期间组合成内存,甚至cpu,简单的说,它就是告诉你“计算机是如何工作的”。可是当提到数字电路的时候,你脑子里首先想到的是什么?是那些跟一座破庙里面的蜘蛛网一样混乱的电路图?晦涩难懂的概念?看似复杂的逻辑?跟枕头一样厚的教科书?我不知道你是怎么想的,反正大学里面的数字电路这门课给我的印象就是这样,当然,我对这门课毫无兴趣。可是当我看完这本书的时候,我才发现,原来数字电路不是用来死记硬背的,复杂的逻辑完全可以从简单的逻辑入手推导过来。作者用导线,电灯泡,开关,这3个家喻户晓的东西拼装出一个个功能各异的元器件,然后再把元器件横向拼装成更复杂的器件,所以整本书的知识结构非常有层次感,在循序渐进的学习过程中,你会觉得一些原本认为复杂难懂的东西是这样“理所当然的简单”。更好玩的是,你完全可以把书上介绍的电路实现一遍,比如去做个内存,甚至cpu出来,你不需要去买二极管,电路板,电焊铁,焊锡丝等等这些工具,只需要下载个《minecraft》(中文名《我的世界》)游戏就行,这是一款模拟现实世界的沙盒游戏,你千万不要被这游戏的低像素给吓跑了,耐心点,你会发现里面有“红石”,“中继器”,“开关”等等元素,你可以用它们模拟出现实中的电路。我当初就在游戏里面实现了一个8位加法器,如下图所示。

这就是输入端了,那9个开关看见没?他可以输入0,1(最右边的开关是控制进位的),而红色的一条条的就是“导线了”。

这是输出端,最左边这位是溢出位,右边8位正常输出,如果石头上面的“火柴”一样的东西亮了,就表明输出是1。

那天晚上花了很长时间才做完这个加法器,这时看到远处太阳升起来,感觉特别美呢!

《汇编语言》

《汇编语言》不是列举一堆的汇编指令,告诉你每个指令该怎么用,事实上这是一本指令手册该做的事情。我们知道机器指令(汇编语言和编译器的产物)是和相应的cpu绑定在一起的,而作者挑选了结构简单的8086cpu,通过讲解某些关键指令来深入理解机器工作的基本原理,让读者有底层编程的体验。有意思的是,书里面提的很多问题以及实验都很“边界”,换句话说,就是能很好的考察你到底有没有真的理解。另外,书里面讲解的很多概念,都是操作系统的基础。

《30天自制操作系统》

《30天自制操作系统》,看到这种N天学会xxx的书,出自本能的反应就是嗤之以鼻,是的,实际上我们很难在30天搞定,但30天不是重点。关键是这本书从0开始到一个完整的操作系统每一步都有源代码,也就是说你完全可以跟着一起敲代码,最后也能做出一个操作系统来,非常具有可操作性。事实上,我觉得最牛逼的“hello word”就是在机器通电后直接在屏幕上显示“hello world”。


祀与戎 , 版权所有蜀ICP备14023000号-6丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:有没有一本从电路开始讲然后汇编再到C语言的书?
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址