若干(&>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案例吧


課後習題,使勁背。這門課真的很簡單哦,加油,


推薦閱讀:
相關文章