知識點:機器語言、匯編語言的產生、匯編語言的組成、存儲器、指令和數據、存儲單元、CPU對存儲器的讀寫、地址總線、數據總線、控制總線、內存地址空間(概述)、主板、接口卡、各類存儲器芯片、內存地址空間。
匯編語言是直接在硬件之上工作的編程語言,首先要了解硬件系統的結構,才能有效地應用匯編語言對其編程。
機器語言
說到匯編語言的產生,首先要講一下機器語言。機器語言是機器指令的集合。機器指令展開來講就是一臺機器可以正確執行的命令。
電子計算機的機器指令是一列二進制數字。計算機將之轉變為一列高低電平,以使計算機的電子器件受到驅動,進行運算。
上面所說的計算機指的是可以執行機器指令,進行運算的機器。這是早期計算機的概念。現在,在常用的PC機中,有一個芯片來完成上面所說的計算機的功能,這個芯片就是我們常說的CPU(Central Processing Unit,中央處理器單元),CPU是一種微處理器。
以后我們提到的計算機是指由CPU和其他受CPU直接或間接控制的芯片、器件、設備組成的計算機系統,比如我們最常見的PC機。
每一種微處理器,由于硬件設計和內部結構和不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機器指令集,也就是機器語言。
早期的程序設計均使用機器語言。程序員們將用0、1數字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過紙帶機或卡片機輸入計算機,進行運算。
應用8086CPU完成計算 s = 768 + 12288 - 1280,機器碼如下:
1011000000000000000000000000011
0000010100000000000000000110000
0010110100000000000000000000101
要書寫和閱讀機器碼程序不是一件簡單的工作,要記住所有抽象的二進制碼。上面只是一個非常簡單的小程序,就暴露了機器碼的晦澀難懂和不易查錯。
匯編語言的產生
早期的程序員很快就發現了使用機器語言帶來的麻煩,它是如此難于辨別和記憶,給整個產業的發展帶來了障礙。于是匯編語言產生了。
匯編語言的主體是匯編指令。
匯編指令和機器指令的差別在于指令的表示方法上。
匯編指令是機器指令便于記憶的書寫格式。
例如:機器指令 1000100111011000表示把寄存器BX的內容送到AX中。匯編指令則寫成mov ax, bx,這樣的寫法與人類語言接近,便于閱讀和記憶。
操作:寄存器BX的內容送到AX中
機器指令:1000100111011000
匯編指令:mov ax, bx
(寄存器,簡單地講是CPU中可以存儲數據的器件,一個CPU中有多個寄存器。AX是其中一個寄存器的代號,BX是另一個寄存器的代號。)
此后,程序員們就用匯編指令編寫源程序??墒牵嬎銠C能讀懂的只有機器指令,那么如何讓計算機執行程序員用匯編指令編寫的程序呢?這時,就需要有一個能夠將匯編指令轉換成機器指令的翻譯程序,這樣的程序被稱為編譯器。程序員用匯編語言寫出源程序,再用匯編編譯器將其編譯為機器碼。由計算機最終執行。
用匯編語言編寫程序的工作過程:
(程序員)匯編指令 --> 編譯器 --> 機器碼 --> 計算機
匯編語言的組成
匯編語言發展至今,由以下3類指令組成。
匯編指令:機器碼的助記符,有對應的機器碼。
偽指令:沒有對應的機器碼,由編譯器執行,計算機并不執行。
其他符號:如:+、-、*、/等,由編譯器識別,沒有對應的機器碼。
匯編語言的核心是匯編指令,它決定了匯編語言的特性。
存儲器
CPU是計算機的核心部件,它控制整個計算機的運作并進行運算。
要想讓一個CPU工作,就必須向它提供指令和數據。
指令和數據在存儲器中存放,也就是平時所說的內存。
在一臺PC機中內在的作用僅次于CPU。離開了內存,性能再好的CPU也無法工作。
這就像再聰明的大腦,沒有了記憶也無法進行思考。
磁盤不同于內存,磁盤上的數據或程序如果不讀到內存中,就無法被CPU使用。
要靈活地利用匯編語言編程,首先要了解CPU是如何從內存中讀取信息,以及向內存中寫入信息的。
指令和數據
指令和數據是應用上的概念。在內存或磁盤上,指令和數據沒有任何區別,都是二進制信息。
CPU在工作的時候把有的信息看作指令,有的信息看作數據,為同樣的信息賦予了不同的意義。
就像圍棋的棋子,在棋盒里的時候沒有任何區別,在對弈的時候就有了不同的意義。
例如,內存中的二進制信息 1000100111011000,計算機可以把它看作大小為89D8H的數據來處理,也可以將基看作指令mov ax, bx來執行。
1000100111011000 --> 89D8H(數據)
1000100111011000 --> mov ax, bx(指令)
存儲單元
存儲器被劃分成若干個存儲單元,每個存儲單元從0開始順序編號,例如一個存儲器有128個存儲單元,編號從0~127。
電子計算機的最小信息單位是bit(音譯為比特),也就是一個二進制位。
8個bit組成一個Byte,也就是通常講的一個字節。
微型機存儲器的存儲單元可以存儲一個字節,即8個二進制位。
一個存儲器有128個存儲單元,它可以存儲128個字節。
微機存儲器的容量是以字節為最小單位來計算的。
對于擁有128個存儲單元的存儲器,我們可以說,它的容量是128字節。
對于大容量的存儲器一般還用以下單位計量容量(以下B來代表Byte):
1KB = 1024B
1MB = 1024KB
1GB = 1024 MB
1TB = 1024 GB
磁盤的容量單位同內存的一樣,以上單位是微機中常用的計量單位。
CPU對存儲器的讀寫
存儲器被劃分成多個存儲單元,存儲單元從零開始順序編號。這些編號可以看作存儲單元在存儲器中的地址。就像一條街,每個房子都有門牌號碼。
CPU要從內在中讀數據,首先要指定存儲單元的地址。
也就是說它要先確定讀取哪一個存儲單元的數據。就像在一條街上找人,先要確定他住哪個房子里。
另外,在一臺微機中,不只有存儲器這一種器件。CPU在讀寫數據時還要指明,它要對哪一個器件進行操作,進行哪種操作,是從中讀出數據,還是向里面寫入數據。
可見,CPU要想進行數據的讀寫,必須和外部器件(標準的說法是芯片)進行3類信息的交互:
*存儲單元的地址(地址信息)
*器件的選擇,讀或寫的命令(控制信息)
*讀或寫的數據(數據信息)
那么CPU是通過什么將地址、數據和控制信息傳到存儲器芯片中的呢?
電子計算機能處理、傳輸的信息都是電信號,電信號當然要用導線傳送。在計算機中專門有連接CPU和其他芯片的導線,通常稱為總線。
總線從物理上來講,就是一根根導線的集合。
根據傳送信息的不同,總線從邏輯上又分為3類,即地址總線、控制總線、和數據總線。
CPU從3號單元中讀取數據的過程如下:
CPU
|
|
內存 |
|
地址線
|
12 [0] |
|
3-----> |
3B [1] |
|
|
9C [2] |
|
數據線 |
08 [3] |
|
8<----- |
31 [4] |
|
|
23 [5] |
|
控制線 |
15 [6] |
|
內存讀寫命令---> |
13 [7] |
|
|
18 [8] |
cpu從內存中讀取數據的過程。
(1)CPU通過地址線將地址信息3發出。
(2)CPU通過控制線發出內在讀命令,選中存儲器芯片,并通知它,將要從中讀取數據。
(3)存儲器將3號單元中的數據08通過數據線送入CPU。
寫操作與讀操作的步驟相似。向3號單元寫入數據26:
(1)CPU通過地址線將地址信息3發出。
(2)CPU通過控制線發出內存寫命令,選中存儲器芯片,并通知它,要向其中寫入數據。
(3)CPU通過數據線將數據26送入內存的3號單元中。
從上面的我們知道CPU是如何進行數據讀寫的??墒?,我們如何命令計算機進行數據的讀寫呢?
要讓一個計算機或微處理器工作,應向它輸入能夠驅動它進行工作的電平信息(機器碼)。
對于8086CPU,下面的機器碼能夠完成從3號單元讀數據:
機器碼:101000000000001100000000
含義:從3號單元讀取數據送入寄存器AX
CPU接收這條機器碼后將完成上面所述的讀寫工作。
機器碼難于記憶,用匯編指令來表示,情況如下:
機器碼:101000000000001100000000
對應的匯編指令:MOV AX, [3]
含義:傳送3號單元的內容到AX
地址總線CPU是通過地址總線來指定存儲器單元的。
地址總線上能傳送多少個不同的信息,CPU就可以對多少個存儲單元進行尋址。
現假設,一個CPU有10根地址線,讓我們來看一下它的尋址情況。
在電子計算機中,一根導線可以傳送的穩定狀態只有兩種,高電平或低電平。
用二進制表示就是1或0,10根導線可以傳送10位二進制數據。
而10位二進制數可以表示多個不同的數據呢?
2的10次方個,最小數為0,最大數為1023。
一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N。
這樣的CPU最多可以尋找2的N次方個內存單元。
數據總線
CPU與內存或其他器件之間的
數據傳送是通過數據總線來進行的。
數據總線的寬度決定了CPU和外界的數據傳送速度。
8根數據總線一次可傳送一個8位二進制數據(即一個字節)。
16根數據總線一次可傳送2個字節。
控制總線CPU對外部器件的控制是通過總線來進行的。在這里控制總線是個總稱,控制總線是一些不同控制線的集合。
有多少根控制總線,就意味著這個CPU提供了對外部器件的多少種控制。
所以,控制總線的寬度決定了CPU對外部器件的控制能力。
內存讀寫命令是由幾根控制線綜合發出的,其中有一根名為讀信號輸出控制線負責由CPU向外傳送讀信號,CPU向該控制線上輸出低電平表示將要讀取數據;有一根名為寫信號輸出的控制線則負責傳送寫信號。
小結
1)匯編指令是機器指令的助記符,同機器指令一一對應。
2)每一種CPU都有自己的匯編指令集。
3)CPU可以直接使用的信息在存儲器中存放。
4)在存儲器中指令和數據沒有任何區別,都是二進制信息。
5)存儲單元從零開始順序編號。
6)一個存儲單元可以存儲8個bit(用作單位寫成"b"),即8位二進制數。
7)1B=8b 1KB=1024B 1MB=1024KB 1GB=1024MB
8)每一個CPU芯片都有許多管腳,這些管腳和總線相連。也可以說,這些管腳引出總線。
一個CPU可以引出三種總線的寬度標志了這個CPU的不同方面的性能:
地址總線的寬度決定了CPU的尋址能力;
數據總線的寬度決定了CPU與其他器件進行數據傳送時的一次數據傳送數;
控制總線的寬度決定了CPU對系統中其他器件的控制能力。
習題:
(1)1個CPU的尋址能力為8KB,那么它的地址總線的寬度為________。
(2)1KB的存儲器有________個存儲單元?存儲單元的編號從__________到__________。
(3)1KB的存儲器可以存儲_________個bit,_________個byte。
(4)1GB,1MB,1KB分別是_____________________________byte。
(5)8080、8088、80286、80386的地址總線分別為16根、20根、24根、32根,則它們的尋址能力分別為:__________KB、________MB、__________MB、______________GB。
(6)8080、8088、8086、80286、80386的數據總線寬度分別為8根、8根、16根、16根、32根。則它們一次可以傳送的數據為:_______B、________B、________B、__________B、_______B。
(7)從內存中讀取1024字節的數據,8086至少要讀_______次,80386至少要讀__________次。
(8)在存儲器中,數據和程序以________形式存放。
答案:
(1)13
解析:微型機的存儲單元可以存儲一個字節,即8個二進制位。8KB即8K字節,即2的13次方個存儲單元。一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N,這樣的CPU最多可以尋找2的N次方個存儲單元。
(2)1024,0,1023
解析:1KB,即1024字節,一個存儲單元為一個字節。存儲單元從零開始順序編號。
(3)8192,1024
解析:1B=8b 1KB=1024B
(4)2^30, 2^20, 2^10
(5)64, 1, 16, 4
解析:一個CPU有N根地址線,表示這個CPU地址總線寬度為N,可以尋址2的N次方個存儲單元。
(6)1,1,2,2,4
解析:一根數據線,只能傳送一位二進制數(0或1,低電平或高電平)
(7)512, 256
解析:8086的數據總線寬度為16,一次可以傳送2個字節,80386的數據總線寬度為32,一次可以傳送4個字節。
(8)二進制(0或1)
內存地址空間(概述)什么是內存地址空間呢?
舉例來講,一個CPU的地址線寬度為10,那么可以尋址1024個內存單元(存儲單元,一個存儲單元在微型機中表示一個字節),這1024個可尋到的內存單元就構成了這個CPU的內存地址空間。
主板
在每一臺PC機中,都有一個主板,主板上有核心器件和一些主要器件,這些器件通過總線(地址總線、數據總線、控制總線)相連。
這些器件有:CPU、存儲器、外圍芯片組、擴展插槽等。
擴展插槽上一般插有RAM內存條和各類接口卡。
接口卡
計算機系統中,所有可用程序控制其工作的設備,必須受到CPU的控制。
CPU對外部設備都不能直接控制,如顯示器、音箱、打印機等。
直接控制這些設備進行工作的是插在擴展插槽上的接口卡。
擴展插槽通過總線和CPU相連,所以接口卡也通過總線同CPU相連。
CPU可以直接控制這些接口卡,從而實現CPU對外設的間接控制。
簡單地講,就是
CPU通過總線向接口卡發送命令,接口卡根據CPU的命令控制外設進行工作。
各類存儲器芯片
一臺PC機中,裝有多個存儲器芯片,這些存儲器芯片從物理連接上看是獨立的、不同的器件。
從讀寫屬性上看分為兩類:隨機存儲器(RAM)和只讀存儲器(ROM)。
隨機存儲器可讀可寫,但必須帶電存儲,關機后存儲的內容丟失;
只讀存儲只能讀取不能寫入,關機后其中的內容不丟失。
這些存儲器從功能和連接上又可分為以下幾類:
隨機存儲器
用于存放供CPU使用的絕大部分程序和數據,主隨機存儲器一般由兩個位置上的RAM組成,裝在主板上的RAM和插在擴展插槽上的RAM。
裝有BIOS(Basic Input/Output System,基本輸入輸出系統)的ROM
BIOS是由主板和各類接口卡(如:顯卡、網卡等)廠商提供的軟件系統,可能通過它利用該硬件設備進行最基本的輸入輸出。
在主板和某些接口卡上插有存儲相應BIOS的ROM,例如:主板上的ROM中存儲著主板的BIOS(通常稱為系統BIOS);顯卡上的ROM中存儲顯卡的BIOS;如果網卡上裝有ROM,那其中就可以存儲網卡的BIOS。
接口卡上的RAM
某些接口卡需要對大批量輸入、輸出數據進行暫時存儲,在其上裝有RAM。最典型的是顯示卡上的RAM,一般稱為顯存。顯示卡隨時將顯存中的數據向顯示器上輸出。換句話說,我們將需要顯示的內容寫入顯存,就會出現在顯示器上。
內存地址空間
上述的各種存儲器,它們在物理上是獨立的器件,但是它們在以下兩點上相同:
1)都和CPU的總線相連;
2)CPU對它們進行讀或寫的時候都通過控制線發現內在讀寫命令。
也就是說,CPU在操縱和控制它們的時候,把它們都當作內存來對待,把它們總的看作一個由若干存儲單元組成的存儲器。
這個邏輯存儲器就是我們所說的內在地址空間。所有的物理存儲器被看作是一個由若干存儲單元組成的邏輯存儲器,每個物理存儲器在這個邏輯存儲器中占有一個地址段,即一段地址空間。
CPU在這段地址空間中讀寫數據,實際上就是在相對應的物理存儲器中讀寫數據。
內存地址空間的大小受CPU地址總線寬度的限制。
8086CPU的地址總線寬度為20,可以傳送2^20個不同的地址信息(大小從0至2^20-1)。即可以定位2^20個內在單元,則8086PC的內在地址空間大小為1MB。
同理,80386CPU的地址總線寬度為32,則內存地址空間最大為4GB。
我們在基于一個計算機硬件系統編程的時候,必須得知道這個系統中的內在地址空間分配情況。
因為當讀者想在某類存儲器中讀寫數據的時候,讀者必須知道它的第一個單元的地址和最后一個單元的地址,才能保證讀寫操作是在預期的存儲器中進行。
比如,讀者希望向顯示器輸出一段信息,那么讀者必須將這段信息寫到顯存中,顯卡才能將它輸出到顯示器上。要向顯存中寫入數據,讀者必須知道顯存在內存地址空間中的地址。
不同的計算機系統的內存地址空間的分配情況是不同的。
內存地址空間
最終運行程序的是CPU,我們用匯編編程的時候,必須要從CPU角度考慮問題。
對CPU來講,系統中的所有存儲器中的存儲單元都處于一個統一的邏輯存儲器中,它的容量受CPU尋址能力的限制。
這個邏輯存儲器即是我們所說的內存地址空間。