在談彙編語言的開始,我想大家可能有這樣的疑問:1、在電腦這個領域內,我們最不缺的就是語言,例如:C,C++,C#,JAVA,PHP,VB,Fortran,phthon·····共256種之多。這裡有這麼多高級語言,我們為什麼一定要學彙編語言,這個看上去並不流行而且比較古老的編程語言?2、彙編語言是 ...
在談彙編語言的開始,我想大家可能有這樣的疑問: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,所以我們在基於電腦硬體編程時,要知道這個系統的第一個單元地址,和最後一個單元的地址,才能保證讀寫操作是在預期的存儲器中進行。