1. 程式人生 > >1-計算機和組合語言

1-計算機和組合語言

1. 什麼是組合語言

組合語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可程式設計器件的低階語言,亦稱為符號語言,是計算機高階程式設計語言的鼻祖。組合語言不像其他大多數的程式設計語言一樣被廣泛用於程式設計,但是組合語言執行效率非常高,快速執行和響應,在某些場合下仍然有著不可替代的作用,例如作業系統核心,工業控制,驅動裝置等領域具有廣泛的應用。

 

2. 為什麼要學習組合語言

雖然組合語言的效率非常高,但是也有壞處,那就是組合語言的開發效率非常低,能做的事情非常有限。

那我們為什麼還要學習組合語言呢?這是因為組合語言在計算機中有著獨特的作用——直擊計算機系統的核心,可以幫助我們更好的學習和理解計算機原理和作業系統的理解,所以學習組合語言還是很有必要的。

也就是說,通過學習組合語言,我們能夠感知,體會和理解機器的邏輯功能。向上為理解各種軟體系統的原理,打下技術理論基礎;向下為掌握硬體系統的原理,打下實踐應用基礎,並掌握底層的程式除錯和錯誤分析方法。

 

3. 由機器語言到組合語言

 

3.1 機器語言與機器指令

機器語言是機器指令的集合。

機器指令是一臺機器可以正確執行的命令。

機器指令則是由一串二進位制數(0和1)來表示的,例如01010000。

 

所以在早期程式設計師們的工作就是將0 , 1這樣的二進位制數的程式程式碼打在紙帶或卡片上,1表示打孔,0表示不打孔,再將程式通過紙帶或卡片機輸入計算機進行運算。

例如計算S = 768 + 12288 - 1280這樣的程式,對應的二進位制機器碼指令如下:

101100000000000000000011

000001010000000000110000

001011010000000000000101

但是這樣會有一個問題,如果用打紙帶編寫這樣的程式時,不小心寫錯了,要找出錯誤是非常頭疼的,所以機器碼指令對於排錯極其不方便,而組合語言就是為了解決這樣的問題。

3.2 組合語言和彙編指令

圖1

 

組合語言的主體就是彙編指令。

彙編指令和機器指令的差別在於指令的表示方法上,彙編指令是機器指令便於記憶的書寫格式,也就是說彙編指令其實就是機器指令的助記符,便於程式設計師們記憶。

 

3.3 組合語言編寫程式的工作過程

圖2

從上圖中可以清楚的看到組合語言的工作過程,當我們編寫好一段彙編程式指令後,計算機是不能直接執行彙編指令,需要編譯器會把彙編程式編譯成機器碼指令,然後交給計算機去執行。

 

下圖是彙編程式的示例:

圖3

 

偽指令不是計算機能直接執行的,而是由編譯器把彙編指令轉換成機器碼指令的過程中需要用到的。

 

4. 淺談計算機的組成

主機板上主要有以下這些部件:

 CPU,是計算機的運算核心和控制核心(即中央處理器)

 匯流排,計算機在執行過程中傳輸資料或指令

 記憶體,計算機執行過程中資料的讀寫

 擴充套件槽(接外部裝置),例如顯示器,鍵盤滑鼠等 

cpu是計算機的核心部件,想要讓cpu進行工作運算就必須向它提供指令和資料,而資料和指令存放在儲存器(記憶體)中。

4.1 處理器

處理器是一臺電子計算機的核心,它會從記憶體中獲取指令,併發起一系列由該指令所以定義的操作,當這些操作結束後,它接著再取下一條指令,通常情況下,這個過程是連續不斷,迴圈往復的。

4.2 暫存器和算術邏輯部件

處理器有很多引腳,其中有一部分引腳是用來將參與運算的資料送入處理器內部,有些引腳是複用的,當被加數送入處理器,就需要通過暫存器儲存資料。算術邏輯單元是專門負責運算的,可以計算加法,減法或乘法,也可以做邏輯運算。

處理器內部還會有一個控制器,在指令的執行過程中,負責給各個部件傳送控制訊號,使各個部件在某個時間點執行某個動作。

標題

 

例如RA和RB暫存器分別儲存了被加數和加數,然後算數邏輯單元計算完後會將結果儲存到暫存器RC中。

處理器總是很繁忙,當它在工作執行的時候,所有資料在暫存器裡面都只能是臨時存在一會,然後在送往別處,這也是它為什麼叫做“暫存器”的原因。在早期暫存器只能儲存4位元,8位元,16位元,也稱為4位,8位,16位暫存器,現在的處理器一般是32位或64位,甚至更多。

 

4.3 指令和資料的表示

計算機中的資料和指令一般是儲存在磁碟或記憶體中,永久性的儲存是存放在外存中,也就是磁碟;當計算機在開始執行工作的時候,需要把資料從外存(磁碟)讀到記憶體中,然後cpu通過匯流排對資料和指令進行運算。

 

我們知道資料和指令都是由二進位制表示的,1000100111011000這樣的二進位制資訊是資料,還是指令呢?

1000100111011000 ─> 89D8H (資料)

1000100111011000 ─> MOV AX,BX (程式)

 

如果我們把這樣的二進位制資訊當做資料來看的話,那麼就是89D8H,H代表是十六進位制的資料形式;如果當做程式來看的話,就是MOV AX,BX這樣的彙編程式指令;也就是說既可以當做資料,也可以當做程式,當然這是由CPU來決定的。

 

資料的表示:

1000100111011000B (二進位制)

89D8H (十六進位制)

104730O(O代表八進位制)

35288D(D代表十進位制)

 

4.4 計算機中的儲存單元

儲存器被劃分為若干個儲存單元,從0開始順序編號。

標題

 

例如:一個儲存器有128個儲存單元,編號從0~127,但實際上記憶體空間是很大的,8086有20條資料線,定址空間220,為1MB,編號為0~FFFFF。

4.5 計算機中的匯流排

在計算機中專門有連線CPU和其他晶片的導線,通常稱為匯流排(英文為BUS),計算機中的匯流排有資料匯流排(Data Bus),地址匯流排(Address Bus),控制匯流排(Control Bus),如下圖所示:

 

地址匯流排(Address Bus):cpu是通過地址匯流排來指定儲存資料的地址,當cpu要從儲存單元(記憶體)讀取或儲存資料時,就可以通過地址匯流排把資料儲存到指定的地址中。地址匯流排越多說明可定址的地址範圍越大,N根地址匯流排(寬度為N),對應定址空間為2^{N} 。

資料匯流排(Data Bus):CPU與記憶體或其它器件之間來回傳輸需要處理或儲存資料的匯流排。資料匯流排的寬度決定了CPU和外界的資料傳送速度。

舉個例子,向記憶體中寫入資料89D8H時的資料傳送。

上圖是8088CPU和8086CPU寫入資料89D8H(十六進位制) ,8088CPU只有8位資料匯流排的,這意味著8088CPU每次只能傳輸8位的資料,在傳輸89D8H十六進位制資料時,需要傳輸兩次。8086CPU有16位資料匯流排,每次可以傳輸16位的資料,在傳輸89D8H資料只需要傳輸一次就可以了。

 

控制匯流排:CPU通過控制匯流排對外部器件進行控制,控制匯流排是一些不同控制線的集合,控制匯流排寬度決定了CPU對外部器件的控制能力。

 

5. 記憶體讀寫與地址空間

 

 

5.1 CPU對儲存器的讀寫

CPU要想進行資料的讀寫,必須和外部器件進行三類資訊的互動:即儲存單元的地址(地址資訊),器件的讀或寫命令(控制資訊),讀或寫的資料(資料資訊)

 

CPU對儲存器的讀寫示例:

機器碼:   101000000000001100000000

16進位制:   A00300

彙編指令: MOV AL,[3]

MOV AL,[3]彙編指令的含義就是從編號為3的儲存單元讀取資料儲存到暫存器AL,過程如上圖所示:CPU通過地址線找到編號為3的儲存單元,然後通過控制線發出讀取資料命令,再由資料線把記憶體的資料08傳輸到CPU中。

 

5.2 記憶體地址空間

CPU是如何通過地址線找到記憶體中的資料的?這又得提到記憶體地址空間了。

CPU地址匯流排寬度為N,那麼其定址空間為2^{N};8086CPU的地址匯流排寬度為20,那麼其定址空間就是2^{20},可以定址1MB個記憶體單元,其記憶體地址空間為1MB。

CPU管理地址空間分配

所有的物理儲存器被看作一個由若干儲存單元組成的邏輯儲存器,每個物理儲存器在這個邏輯儲存器中佔有一個地址段,即一段地址空間;CPU在這段地址空間中讀寫資料,實際上就是在相對應的物理儲存器中讀寫資料。

 

5.3 暫存器及資料儲存

暫存器是CPU內部的資訊儲存單元,8086CPU有14個暫存器:

通用暫存器:AX、BX、CX、DX

變址暫存器:SI、DI

指標暫存器:SP、BP

指令指標暫存器: IP

段暫存器:CS、SS、DS、ES

標誌暫存器:PSW

8086CPU所有的暫存器都是16位的,可以存放兩個位元組。

 

以通用暫存器AX為例,一個16位暫存器儲存一個16位的資料,最大可以儲存216 - 1,十進位制為65535。

 

 

在AX中儲存20000D(八進位制),十六進位制為4E20H,二進位制為0100111000100000B:

 

那麼現在有一個問題,上一代CPU中的暫存器都是8位的,那麼8086CPU要如何保證程式的相容性?

 

解決方案就是通用暫存器都可以分為兩個獨立的8位暫存器使用,也就是說,對於AX暫存器,可以分為AH和AL兩個獨立的暫存器,當你操作其中一個暫存器時,並不會影響到另一個暫存器;同理, BX可以分為BH和BL, CX可以分為CH和CL,等等......

另外,把二進位制資料轉換成十六進位制可以直觀的看出這個資料是由哪些8位資料構成。

 

5.4 “字”在暫存器中的儲存

對於8086CPU來說,它的暫存器是16位的,可以儲存2個位元組,這稱為1個字(word),各個數位編號為0 - 15,其中0-7是低位元組,8-15是高位元組,這個字的高位位元組存在這個暫存器的高8位暫存器, 這個字的低位位元組存在這個暫存器的低8位暫存器。

同理,對於32位暫存器可以存放4位元組,這稱為一個雙字(double word),各個數位編號為0 - 31,其中0-15是低位元組,16-31是高位元組。64位暫存器以此類推.....