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