還是從微機原理講起
為啥要從《微機原理》說起呢?因為它是一本純粹講解計算機底層系統的的基礎書籍,很多有關計算機原始設計的知識都可以在這里找到答案,所以建議大家如果對計算機系統不太熟悉應該多看幾遍,有些東西看著看著就會了。當你愿意靜下心來看書籍的時候某些書本上沒有的答案你才會主動去尋求解答,我覺得這才是真正有意義的大學學習過程。其實我們的大學教材很多是不完整的,特別是基礎性知識,可能在注解或文后參考文獻才會有些提示。有些知識點你就不可能在教材上找得到答案,而是要去圖書館或者官方手冊或網站查詢才能獲得解釋。
我并不是說編寫教材的人水平有問題或做的不對,恰恰相反,能作為高校教材的經典的書籍,編者的水平在國內絕對是該領域有名的專家。他們出書安排的本意也是希望學生能夠自主學習,多去了解,拓展知識,畢竟教材的厚度有限,知識日新月異,涉及的幾乎無限。大學本應該是一個自主求學的地方,那些老教授他們當初是在基礎條件匱乏的環境中突破一層層障礙成長起來的,寫教材也肯定用心良苦。
只是他們的教材傳到學生手里就變成一部分人要依賴老師劃重點才能及格的境地,這種情況持續時間長了,就總會有些是原來學的馬馬虎虎的學生來學校當老師了,本來自己沒整明白,學生似乎也不太想整明白,到最后教的內容就只能照著書本找答案了。當然肯定不是所有老師都這樣,在教學的過程中很多年輕老師還是隨著資歷提升授課水平也不斷提升,前面的少數代表不了整體,所幸我在大學遇到的老師都挺好,只怪自己當初不給力,沒能得到真傳,今天剛好又是教師節,祝福天下老師節日快樂!
linux之父linus在大學期間設計出了第一版linux系統,我只能說他真是天才般的存在,那時的條件與我們所處環境相比,幾乎一個人完完整整設計出了一整套系統,所需腦力何其巨大!在校時我還專門讀過他的源碼,即便一共只有萬把行代碼,很多都難以理解的,看了這頁忘了那頁都是常事,最后也沒領會它的真諦,沒過多久就忘得差不多了,現在若有人叫我去看他的源碼,我會直截告訴他,算了吧,我真不是那塊料,我還是干好我的本分事吧。有興趣的朋友可以去看看他的代碼,但是不建議初學者看,至少能熟練運用C語言,有匯編基礎才能看,否則對你學習百害無一利!
《微機原理》這門課程中主要是以英特爾的80x86芯片介紹來計算機的底層原理,一般情況下,計算機,電子相關專業的同學在完成計算機基礎和C語言(或其他某高級語言)的學習之后,就會從微觀方面來學習計算機系統?!段C原理》中就會介紹計算機的數制、編碼,CPU的由來,以及內部功能結構,然后就引出了80x86芯片,這些內容結合已學的知識多數人都應該容易理解。
上面這個圖很眼熟吧,51單片機也有類似結構,接著課本就進入到了80x86指令系統的介紹,覺得《微機原理》很難的同學應該就是從這開始迷茫的吧,什么立即尋址,直接尋址,寄存器間接尋址,基址變址尋址等等一大堆讓人頭疼的概念。外加各種指令,操作符,又是地址,又是內存,又是寄存器,存儲單元的,這些看這都夠眼花繚亂了,老師還叫你背下來說期末要填空,不是要了老命嗎,對不對?練習題里給你一段代碼然后給出如下圖這樣的示意圖,問你能不能整明白啥是啥,啥等于啥?這能不暈?老師都能給你真暈。
看了上面的舉例看暈的沒?如果看暈了那我的目的就達到了,接下來我接給你整明白它。
接下來
匯編語言怎么對應機器語言
上面說了這么多匯編語言相關的內容越說越迷糊了,要解決疑惑,首先來認識一下維基百科對匯編語言的定義。
匯編語言(英語:assembly language:匯編語言)是任何一種用于電子計算機、微處理器、微控制器,或其他可編程器件的低級語言。在不同的設備中,匯編語言對應著不同的機器語言指令集。一種匯編語言專用于某種計算機系統結構,而不像許多高級語言,可以在不同系統平臺之間移植。
從定義可以知道的信息是:匯編可以存在于任何一種帶控制功能的芯片中,但每種控制芯片支持的匯編語言不一定一樣!為什么會這樣呢?芯片廠商設計一款芯片定義它的邏輯功能的同時肯定就定義好了它的操作指令,所以現在我們會聽到有各種架構的芯片存在,每一種架構實際都是一套指令系統,比如80x86,MIPS32,8051,AVR,RISC-V等等各種指令集,芯片廠商可以提供匯編指令集給使用者,但使用者也可以自己定義匯編指令,當然這些使用者都是大廠啦,我們這些普通用戶就直接用廠商提供的就足夠了,像微機原理和51單片機的匯編指令都是Intel自己定義好給我們的。這也就是我們之前說的匯編語言的局限性,不方便移植,今天我們就不追究這些了。
好了,再看后面一句標紅的文字,意思就是每種芯片的匯編語言都對應器上面的機器語言的指令,這句話才是我們搞清楚匯編語言的與機器語言關系的關鍵所在。簡單的說就是我們寫的每一句有實際意義的匯編語句它就對應一個機器碼,也就會對應一個機器指令,CPU就根據這些連串的機器碼執行一系列的機器操作,這就是我們寫的程序執行結果。先記住這句好,具體的對應關系看后文一一介紹。那什么是有意義的匯編語句呢?他們就是匯編語言指令,也就是你不樂意記的mov,add,inc,jmp等等,那么對應的就有一些無實際意義的匯編語句,我們所說的匯編偽指令就是了,比如db,dw,equ等等,這些語句一般用來定義變量,或做指示,標識用,是起輔助作用不參與程序運行。
我們都知道,我們的51單片機是8位機,所以它內部的操作碼就有8bit,也就是說它內部最多可以有2^8=256個操作碼。現在匯編指令確定了,操作碼總數確定了,剩下的就是一個蘿卜一個坑式的填充它們之間的對應表了吧。
那究竟這二者之間的怎么對應的呢?
我們可以查看一些芯片的官方手冊,專業一點的廠商都會列出這些信息,有些書籍上也會有,但一般再附錄中出現,并且內容不會很詳細,所以平時查看還是以官方手冊為準。我這里貼幾個圖展示說明一下。
這是STC數據手冊中的指令集說明,信息是挺多的,但我們似乎還是找不到這些對應關系,但是我們可以看到這里列出了每個匯編指令結合各種尋找方式,那機器碼應該與這些有關吧。接下來我們繼續找資料挖掘:
可以看到,這里發現了代碼二字,看來離目標越來越近了,我們是不是應該多看看英文資料呢?
果然還是能找到信息,現在這個表就把他們關系都對應上了吧!有些人可能還是看不懂這個表究竟怎么讀,舉個例子,nop指令,位于第0行第0列,組合來它對應的機器碼值就是0x00,同樣的,ajmp指令位于第0行第1列,組合碼就是0x01??疵靼琢税?,就是一個二維數組。每個指令的各種尋址操作都在其中一一展現,根據前面手冊中的信息就可以得到完整的對應表了。這么看這個表還正有點容易犯迷糊。我們可以再做得簡單易懂一些。
看這個表就簡單多了吧,當然這里例舉的只是部分表格內容,詳細表格內容不較多,不好全截圖,現在這些資料沒有整理到云盤,后面再找個時間統一處理一下,分析鏈接出來,近期需要這些資料的朋友可以私信或留言,我直接發文件。
現在我再來舉個例子來說明一下,大家應該就可以更好的理解它們。
現在看到這條個圖你會怎么想?你是不是首先想到去看mov指令的規則?解釋這句代碼的意思,這傻子都知道的吧。今天看了這篇文章你應該還需要知道的是看到右邊rom中的數據就能得出左邊的匯編語句,這層關系想明白了嗎?
評論
查看更多