1. 程式人生 > >匯編第一章--基礎知識梳理與總結

匯編第一章--基礎知識梳理與總結

central eight 最大 http 總線 p s 第一個 大小 電信

在談匯編語言的開始,我想大家可能有這樣的疑問:1、在計算機這個領域內,我們最不缺的就是語言,例如:C,C++,C#,JAVA,PHP,VB,Fortran,phthon·····共256種之多。這裏有這麽多高級語言,我們為什麽一定要學匯編語言,這個看上去並不流行而且比較古老的編程語言?2、匯編語言是一種什麽樣的編程語言,它存在的魅力與價值在哪?3、學習了匯編語言以後我們能幹什麽?當然在我們學習匯編語言之初肯定無法回答這些問題,陸遊就曾有一句;“絕知此事要躬行”,在我們慢慢進入了匯編的殿堂之後,我想這些問題就早已不言而喻了。

一、計算機編程語言的演進:

計算機語言總的來說分為機器語言,匯編語言,高級語言三大類,而這三種語言也恰恰是計算機語言發展的三個階段。

下圖為計算機的發展階段:

技術分享圖片技術分享圖片

我們先來感受一下三個階段語言的不同的特點:

技術分享圖片

從這張圖你可能會發現,機器語言代碼這是什麽呀,人類根本讀不懂,那到底什麽是機器語言呢?

1、機器語言:

技術分享圖片

在早期,機器語言是直接對硬件進行操作,但是機器語言是0和1的字符串,這就是的早期程序員的工作十分繁雜,如果0或者1有一位出錯,那麽整個程序就會崩潰,那麽如何解決這個問題呢?在這時,匯編語言就應運而生了。

2、匯編語言:

技術分享圖片

這樣人類與計算機就通過匯編語言這一媒介第一次產生了聯系:

機器指令:1000100111011000

操作:寄存器BX的內容送到AX中

匯編指令:MOV,AX,BX

計算機執行匯編語言的基本過程:

技術分享圖片

但是從圖二我們也可以看到,匯編語言還是過於繁瑣,只能在懂計算機的程序員之間廣泛流傳。而在普通人之中,他們無法理解這個比較復雜的語言,所以為了讓計算機編程語言更加普及,聰明的程序員們想出了更加簡潔的方式,這是高級語言橫空出世。

3、高級語言:

技術分享圖片

當今比較流行的高級語言:

技術分享圖片

二、匯編語言的組成與用法:

匯編語言發展至今,有以下3類指令組成。

(1):匯編指令:這是機器碼的助記符,有對應的機器碼。

(2):偽指令:沒有對應的機器碼,由編譯器執行,計算機並不執行

(3):其他符號:如 + - * / 等,由編譯器識別,沒有對應的機器碼

匯編語言的核心是匯編指令,它決定了匯編語言的特性。

學習計算機的人肯定都認識計算機之父------馮.諾依曼,他提出的計算機的五大體系至今仍是計算機的基本結構:

技術分享圖片

從該圖中我們可以發現計算機的核心是Central Contral——CPU,它控制整個計算機的運作並進行運算。要想讓一個CPU工作,就必須向它提供指令和數據,指令和數據是應用上的概念。在內存或磁盤上,指令和數據沒有任何區別,都為二進制信息。指令和數據在存儲器中存放,也就是Memory(內存),再好的CPU如果沒有內存,就無法工作。因此,我們要了解CPU到底是怎樣從內存中讀取信息以及向內存中寫入信息的。

存儲器被劃分為若幹個存儲單元,每個單元從0開始順序編號,就好比一棟大樓有128個房間,各個房間有門牌號0~127。那麽一個存儲單元能存儲多少信息呢?電子計算機的最小信息單位是bit,也就是一個二進制位。8個bit組成一個Byte,也就是一個字節。微機存儲器的容量是以字節為最小單位來計算的。對於大容量的存儲器一般還用以下的單位來計算容量:

1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB

1GB=230Byte 1MB=220Byte 1KB=210Byte

CPU要想進行數據的讀寫必須與外部器件進行3類的信息交互:

?存儲單元的地址信息(地址信息)   ?器件的選擇,讀或寫的命令(控制信息)   ?讀或寫的數據(數據信息)

既然CPU要讀取數據,那麽數據怎麽傳輸呢?電子計算機能處理的都是電信號,電信號肯定要用導線傳送。計算機中有專門連接CPU和其他芯片的導線,通常稱為總線,總線從邏輯上又分為3類:地址總線,控制總線和數據總線。

CPU從3號單元讀取數據的過程如下:

技術分享圖片

(1)CPU通過地址線將地址信息3發出  (2)CPU通過控制線發出內存讀命令,選中存儲器芯片,並通知它,將要從中讀取數據  (3)存儲器將3號單元中的數據8通過數據線送入CPU

地址總線:CPU通過地址總線來指定存儲器單元,因此地址總線的數量決定了能夠表示多少個地址,例如:一個CPU有10根地址總線,一根導線可以傳送的穩定狀態只有高電平與低電平,用二進制表達也就是0或1,10根導線可以傳送10位二進制數據,也就是可以傳送210個不同的數據,最小數為0,最大數為1023。

因此我們可以總結:一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N。這樣的CPU最多可以尋找2n個內存單元,編號為:0~2n-1

10根地址總線的CPU向內存發出地址信息11的二進制示意圖:

技術分享圖片

②數據總線:數據總線的寬度決定了CPU和外界的數據的傳送的速度,8根數據總線一次可以傳送8位2進制數據(即是一個字節),16根數據總線就是兩個字節,8088CPU的數據總線的寬度為8,8086CPU的數據總線寬度是16,下圖展示了8086CPU數據總線的傳輸情況:

技術分享圖片

③控制總線:控制總線的寬度決定了CPU對外界部件的控制能力。

下面開始一個新的內容:內存地址空間,比如說,一個CPU的地址總線寬度為10,那麽可以尋址1024個內存單元,這1024個可尋的內存單元就構成了這個CPU的內存地址空間,內存地址空間並不是真正存在的,是邏輯上的地址空間。內存地址空間比較抽象,若想深入了解就必須具備兩個知識點:主板與接口卡。

主板:上面有核心器件,和一些主要器件,這些器件通過總線相連,器件有CPU,存儲器,外圍芯片組,擴展插槽(其中插有RAM內存條和各類接口卡)

接口卡:就是連接一些外部設備,可以讓CPU對外部設備進行控制,比如顯示器,音響,打印機·······

CPU在控制這些器件時,只是把它們當作內存來看,把它們總的看作一個由若幹存儲單元組成的邏輯存儲器,這個邏輯存儲器就是我們所述的內存地址空間

技術分享圖片

在上圖中,所有物理存儲器被看做一個邏輯存儲器,每個物理存儲器在邏輯存儲器中都有一個地址段,即是一段地址空間(註意:存儲器並不是一段一段的)CPU在這段地址上讀寫數據,實際上就是在相應的物理存儲器中讀寫數據。內存空間的大小受到地址總線寬度的限制,比如:8086CPU地址總線寬度為20,則尋址能力為2^20 即是1MB,80836CPU的地址總線寬度是32 則內存地址空間最大為4GB,所以我們在基於計算機硬件編程時,要知道這個系統的第一個單元地址,和最後一個單元的地址,才能保證讀寫操作是在預期的存儲器中進行。

匯編第一章--基礎知識梳理與總結