若干(&>10)年前,我学计原的时候,在学校BBS上的留言。我学的时候主要讲的8086和外围晶元的应用,以及汇编语言。。

那个时候google还能访问,但是教学资源和手段不如现在的丰富。

现在看来,那时的文字非常幼稚,至少不符合知乎的高冷装逼范。但是实在再重新写篇新的,你就当一个二十出头的毛头小子在装逼好了……也不要问我问题,因为当时学的已经不记得了。我现在在做和ARM相关的东西……

仅供参考。

公众号/商业用途的修改/转载需获得本人授权。其他分享请随便(修改不得改变文意),但需注明作者和出处。


怎么学好微机原理。

仅做参考,仅是来自于一个学过这门课的学生的经验和教训

1.门槛

门槛是什么?你只会爬的时候,能走就是你的门槛;你能走了以后,跑就是你的下一个门槛,而且所谓门槛,就是你一旦迈过去了,对你来说就不再是障碍了。任何一门新知识也是门槛,微机原理也不例外。而且需要注意的是,「迈」这一步动作并不复杂,难的是为迈这一步做的准备。就像在学会走之前,婴儿已经把爬的动作练得很熟练了。微机原理呢?我觉得是一门编程语言,具体这门语言是什么不重要,重要的是能够掌握编程的基本原理。从我自身和身边同学的经验来看,会编程对你学好微机原理,尤其是汇编语言,有很大帮助。对于下决心要学好或者不得不学好微机原理的同学来说,请先练练你的编程基础。

2.幻想

幻想一:

汇编语言不会编。

对于大多数人来说,更确切的说法应该是:汇编语言不「汇编」(就是这两个字,我没有打错),结果导致:汇编程序记不住。——荒唐。从来没有哪门编程语言是靠死背程序段才学会的,也没有哪门语言能仅通过纸上谈兵就能学明白。有人说C语言难,汇编更难。其实学到一定程度的时候,你会发现,用汇编,自由度比C语言大得多,要实现一个目的,有很多路可以走。

所以:请「汇编」,或者说,请实践。

这就像你刚开始学字的时候,刚开始还得照书看写形,写过几遍之后,就可以不看书写了;后来,会写很多字了,更关心的问题是,这字怎么写著好看,于是拿出好看的字模,体会这个字为什么好看,再临摹——当然,这两步有时候是可以合而为一的——于是一点点字就练会了练好了。

可惜的是,很多人对这么简单的道理视而不见(等到你在准备期末考试的时候你会发现你基本不用操心所谓的「不会编」问题)。大部分学生在这个时候已经有电脑了,装个汇编编译器并不复杂(真的很简单,甚至比你装个游戏还要简单省时)。你不知道怎么装,置底有说明;编程出错了,可以GOOGLE,可以发帖子问,可以……总之会有很多人能帮而且会帮你。但是如果连这点你也不愿做,那么报歉,谁也帮不了你,这个帖子你看到这里就可以打住了。

幻想二:

汇编语言有捷径。

我们想问题总会走极端。幻想一不对,那幻想二是不是有可能?报歉,没有。所谓捷径,不过是条条大路当中相对好走的一条。声称发现捷径的人(包括这在写这帖的我),一般都是走过了很多路,事后给你总结一条「相对」好走的路,或者是,他根本就是运气很好……但其实,再好走的路,也得去走。就像我们买了一本单词书,不代表我们掌握了书里的单词——一如你看了我的帖子,也不等于你学会了微机原理。

所以,请参考我在幻想一中给出的建议,至少,它比在期末背若干程序段要来得轻松。

3.课前·课上·课后

这部分其实不仅适用于微机原理,放在任何一个「如何学好XXXX」的文章都是有意义的。

课前做的是预习。这个因人而异。我很少预习(除了期末突击某门平时根本没学的科目),因为一旦我预习了,很可能上课就不听了。但是预习,对于很多人来说,对掌握课堂内容有非常大的帮助。所以这个取决于个人。

课上做的是听课——这不是一句废话~!现在有多少人是以听课的状态在教室里坐著呢?据我所知,不多。听课是什么状态?不是睡觉看杂志玩PS发简讯聊天干坐著等老师点名;也不是干记笔记,也不是干听老师讲什么。后两点尤其值得很多人注意。因为很多人就是这个状态,而且一直是。请注意,所谓听课,真正关键的环节,是「想」。很多人说自己时间不够用,明明听了课,作业又做不明白。为什么?因为他们上了课花了时间,下了课,又得翻好几遍书,才能把书上的问题明白得五五六六。这相当于上课的时间都被浪费掉了,理解课程内容的机会也被浪费掉了。课后在没人指导的情况下,当然要花更多的时间……

上课的时候,最理想的情况,是一直跟著老师的思路。老师讲出一个陈述,这时候最重要的——不一定(我说的是「不一定」,不是「不」)是把这个陈述记下来,因为这个陈述很可能在课件或者教材上有,上课时间是不能浪费在「抄写」这种低级的事情的——是想想:这个陈述的意义是什么?为什么是这样?根源是什么?怎么应用(功利一点,怎么用这个陈述来做题)?在特殊情况下,会有什么情况?这些思考往往就是一闪念间的东西,但是每节课这么几个一闪念,就足以让你掌握这一节课的关键点了,因为你是从深层去理解了这个陈述。比较夸张的时候,往往是我刚想到一些问题,老师紧跟著就讲了,课后也不用怎么看书,因为上课的时候已经印象深刻了,即使忘了,也很很容易回忆起来——这种感觉,很爽的。如果你愿意,你也会体会到。

具体到微机原理课上,老师说:某XX程序要实现XX功能,试编程……,而且往往给你时间去写。真的用写吗?不用(顶多在纸上划拉几笔)!因为时间不够用,但是一定要去想这个程序大体上都要做些什么,怎么去实现,用什么指令(用到的指令肯定是刚讲过的)。这三步是一步步细化的。也许一开始的时候,还不适应,可能刚有个大框,时间就到了。这取决于你的编程能力怎么样。稍好一点的人可能很短的时间内就能细化到指令了,框架对他们而言已经不是问题了——这是为什么我要求要有好一点的编程基础。但是,不管你是什么水平,在任何时候,都请不要放弃这种思考。到了后期,应该可以做到细化指令的程度了,变态一点的可以想出好几套可行的命令,并选出一个最好的(我能做到,但是是做了很多实践、读了很多程序的结果)。

程序想出来了,时间还没到,是不是很得意?别急,看看老师的样常式序,是不是更洁练?这是必然的,用了十几年的程序当然要很简练。想想你的问题出在哪?框架有问题?忽略一些问题?命令用得不够巧(这点往往是主要原因)?那么好,记住:这个XX命令原来还可以用来XX~!再想(当然可以翻翻书和课件):这个好用的XX命令还可以怎么用?再想:和这个XX命令相似的YY命令们都有什么样的相似功能?——不会的东西永远是没接触过的和不熟悉的。——你在课上一直在强化这些命令,岂能记不住?

真的,上课的时候你能做到这些了,不信你微机(起码是汇编)学不好。不要懒,懒于思考比懒于上自习还要致命~!

课后做作业。就像老师的常式很少出现没讲过的命令一样,作业里面也一般是老师上课的要点。怎么做?写个程序,实际上机运行调试一下,比翻书有效得多。有时候犯了个错误,花了很长时间才排除——这样的错误会让你记它一辈子,也会让你下次不会再犯。而「纸上谈兵」的同学不实际操作可能认识不到这个问题——这是你的收获。另外把课上想了,但是没写过的程序编一编。可以复习那些巧妙的指令。如果你觉得你的方法比老师的好,那么试一下:如果成功了,HAPPY一下,记住——顺便增长自信;如果没成功,想想为什么没成功。

写程序的时候,也不要忘记思考:我这段代码,可不可以再改进?我当初练习编程的时候,往往是一个程序写成了,去吃饭,吃饭的时候,想到一个更好的办法,改;改完了,上个厕所,又有一个更好的办法,再改!……经过这样的锤炼,对命令的掌握和框架的理解进步是很快的。有一些小技巧,为了不让打算入门的同学见难而退,我把它们放在附言里面,有兴趣的同学可以看下。

4.沙·树·网

OK,猜猜我想要说什么?

我要说的是知识结构。一个完美的知识结构就是一张网。各个知识点就是结点。懒人只去「背」,背了,就再不思考。这样的结果,就一脑袋沙子。在不明确提到的情况下,很难用到,而且容易记错。好一点的同学的知识结构是树,里面有主线,有分支,再往下是细节。这样回忆起来更容易,而且更清晰,有助于理解。更厉害的同学,脑子里都是网(我不行,顶多是棵榕树(思考:榕树是什么意思?)),即知识点之间不但有纵向的联系,还有横向的——知识应该学到这个份上才可以。

最直接的好处,就是一旦哪个知识点记不清了,OK,看看横向的联系,看看其它相关的知识点是怎么样,然后按著这个关系,推回来,这个点就清楚了——除非关系记错了,或者大部分结点都记错了,否则因为有横纵两层关系,这样出错的可能性很小。我在实际中有一点类似的体会,也放在附言里了。

间接一点的好处是,有利于触类旁通,如果能做成网型结构,新知识不过是填空,而且内容都是可以想见的。另外,某一学科的网型结构有可能在你学习另一个学科的时候给予帮助。

总结:

就这些吧,有点写累了。希望对大家有所帮助。

核心:多实践,多想。

附言1:

判断al是否为0,并根据结果跳转

基本:cmp al,0 jnz XXX 改进:test al,0 / and al,al jnz XXX

判断al是否比0小。

基本:cmp al,0 jl XXX 改进:and al,al / test al,80h js XXX

……

版里面也有一些不错的东西,可以往上翻翻。

把al乘2

基本:用MUL

改进:用移位/用ADD

附言2:

在CALL FAR XXX、远跳转、中断向量表中,IP和对应的CS的储存关系是什么?

IP永远在低址,CS永远在高址。(顺便记住了在子函数返回时,先弹IP,因为栈从高址向低址生长)

除法的时候,商和余数都存在什么寄存器里面?

不论是32位还是16位除法,商都存在较低的部分(AL比AH低,AX比DX低),余数都存在较高的部分。


可以看一下csapp,或者南大袁春风老师的计算机系统基础


刚刚考完计算机组成原理,老师略坑,成天讲一些把底层学号的重要性,实质性的内容没讲,好在有一些单片机基础,也不是很难。考试就靠刷题吧。真想学到东西,还得自己动手,如果学校提供实验课,一定要好好参加,一次实验顶好几节理论课。


时间+精力


倒著学习机组,从金子塔尖往下学习,带著问题学习,两边下来就可以了


把底层运算原理熟练了,原反补码什么的。理解每条指令在组件走的流程,看个小小的cpu案例吧


课后习题,使劲背。这门课真的很简单哦,加油,


推荐阅读:
相关文章