[彙編]《組合語言》第1章 基礎知識
王爽《組合語言》第四版 超級筆記
目錄第1章 基礎知識
1.1 機器語言
機器語言是機器指令的集合。
機器指令展開來講就是一臺機器可以正確執行的命令,計算機的機器指令是一列二進位制數字。
現在,在我們常用的PC機中,有一個晶片來完成計算機執行機器指令、進行運算功能。這個晶片就是我們常說的CPU(Central Processing Unit,中央處理單元),CPU是一種微處理器。
以後我們提到的計算機是指由CPU和其他受CPU直接或間接控制的晶片、器件、裝置組成的計算機系統,比如我們最常見的PC機。
每一種微處理器都有自己的機器指令集,也就是機器語言。
早期的程式設計均使用機器語言。程式設計師們將用0、1數字編成的程式程式碼打在紙帶 或卡片上,1打孔,0不打孔,再將程式通過紙帶機或卡片機輸入計算機,進行運算。
應用8086CPU完成運算s=768+12288-1280,機器碼如下:
101110000000000000000011
000001010000000000110000
001011010000000000000101
在顯示器上輸岀“welcome to masm”,機器碼如下:
0001111010111000
0000000000000000
0101000010111000
1100011000001111
1000111011011000
1011010000000110
1011000000000000
1011011100000111
1011100100000000
0000000010110110
0001100010110010
0100111111001101
0001000010110100
0000001010110111
0000000010110110
0000000010110010
0000000011001101
0001000010110100
0000100110001101
0001011000101010
0000000011001101
0010000110110100
0000101010001101
0001011000110001
0000000011001101
0010000110110100
0000011010110000
0001010010110111
0001100110110101
0000101110110001
0001001110110110
0000110110110010
0011110011001101
0001000010110100
0000001010110111
0000000010110000
0000110010110010
0001010011001101
0001000010110100
0000100110001101
0001011000000000
0000000011001101
0010000111001011
1.2 組合語言的產生與組成
組合語言的主體是彙編指令。
彙編指令和機器指令的差別在於指令的表示方法上。
彙編指令是機器指令便於記憶的書寫格式。
操作:將暫存器BX的內容送到AX中
機器指令:1000100111011000
彙編指令:mov ax,bx
(暫存器,簡單地講是CPU中可以儲存資料的器件,一個CPU中有多個暫存器。AX是其中一個暫存器的代號,BX是另一個暫存器的代號。)
計算機如何執行程式設計師用匯編指令編寫的程式呢?
組合語言有以下3類指令組成
-
彙編指令:機器碼的助記符,有對應的機器碼。
-
偽指令:沒有對應的機器碼,由編譯器執行,計算機並不執行。
-
其他符號:如 +、-、*、/ 等,由編譯器識別,沒有對應的機器碼。
組合語言的核心是彙編指令,它決定了組合語言的特性。
1.3 儲存器、指令、資料、儲存單元
CPU工作,就必須向它提供指令和資料。
指令和資料在儲存器中存放,也就是我們平時所說的記憶體。
在一臺PC機中記憶體的作用僅次於CPU,離開了記憶體,效能再好的CPU也無法工作。
要靈活地利用匯編語言程式設計,我們首先要了解CPU是如何從記憶體中讀取資訊,以及向記憶體中寫入資訊的。
指令和資料是應用上的概念。
在記憶體或磁碟上,指令和資料沒有任何區別,都是二進位制資訊。
CPU在工作的時候把有的資訊看作指令,有的資訊看作資料,為同樣的資訊賦予了不同的意義。
例如,記憶體中的二進位制資訊1000100111011000,計算機可以把它看作大小為89D8H的資料來處理,也可以將其看作指令mov ax,bx來執行。
注:89D8H 中的H是十六進位制的標識Hex
1000100111011000 -> 89D8H (資料)
1000100111011000 -> mov ax,bx (程式)
儲存器被劃分成若干個儲存單元,每個儲存單元從0開始順序編號。
例如一個儲存器有128個儲存單元,編號從0〜127,如圖1.2所示。
我們知道電子計算機的最小資訊單位是bit(音譯為位元),也就是一個二進位制位。
8個bit組成一個Byte,也就是通常講的一個位元組。
1Byte = 8 bit
對於大容量的儲存器一般還用以下單位來計量容量(以下用B來代表Byte):
1KB=1O24B 1MB=1O24KB 1GB = 1024MB 1TB = 1024GB 1PB = 1024TB
磁碟的容量單位同記憶體的一樣,實際上以上單位是微機中常用的計量單位。
1.4 CPU對儲存器的讀寫
儲存器被劃分成多個儲存單元,儲存單元從零開始順序編號。
這些編號可以看作儲存單元在儲存器中的地址。
CPU要從記憶體中讀資料,首先要指定儲存單元的地址。
CPU要想進行資料的讀寫,必須和外部器件(標準的說法是晶片)進行下面3類資訊的互動。
-
儲存單元的地址(地址資訊);
-
器件的選擇,讀或寫的命令(控制資訊);
-
讀或寫的資料(資料資訊)。
那麼CPU是通過什麼將地址、資料和控制資訊傳到儲存器晶片中的呢?
在計算機中專門有連線CPU和其他晶片的導線,通常稱為匯流排。
匯流排從物理上來講,就是一根根導線的集合,根據傳送資訊的不同,匯流排從邏輯上又分為3類,地址匯流排、控制匯流排和資料匯流排。
CPU從3號單元中讀取資料的過程(見圖1.3)如下。
(1)CPU通過地址線將地址資訊3發出。
(2)CPU通過控制線發出記憶體讀命令,選中儲存器晶片,並通知它,將要從中讀取資料。
(3)儲存器將3號單元中的資料8通過資料線送入CPU。
寫操作與讀操作的步驟相似,如向3號單元寫入資料26。
(1)CPU通過地址線將地址資訊3發出。
(2)CPU通過控制線發出記憶體寫命令,選中儲存器晶片,並通知它,要向其中寫入資料。
(3)CPU通過資料線將資料26送入記憶體的3號單元中。
如何命令計算機進行資料的讀寫呢?
對於8086CPU,下面的機器碼,能夠完成從3號單元讀資料。
機器碼:101000010000001100000000
含義: 從3號單元讀取資料送入暫存器AX
CPU接收這條機器碼後將完成我們上面所述的讀寫工作。
機器碼難於記憶,用匯編指令來表示,情況如下。
機器碼:101000010000001100000000
對應的彙編指令:MOV AX,[3]
含義: 傳送3號單元的內容入AX
1.5 CPU的三大匯流排
CPU是通過地址匯流排來指定儲存器單元的。
可見地址總線上能傳送多少個不同的資訊,CPU就可以對多少個儲存單元進行定址。
一個CPU有N根地址線,則可以說這個CPU的地址匯流排的寬度為N。這樣的CPU最多可以尋找2的N次方個記憶體單元。
CPU與記憶體或其他器件之間的資料傳送是通過資料匯流排來進行的。
資料匯流排的寬度決定了CPU和外界的資料傳送速度。
8根資料匯流排一次可傳送一個8位二進位制資料(即一個位元組)。16根資料匯流排一次可傳送兩個位元組。
8088CPU的資料匯流排寬度為8, 8086CPU的資料匯流排寬度為16。
8086有16根資料線,可一次傳送16位資料,所以可一次傳送資料89D8H;而8088只有8根資料線,一次只能傳8位資料,所以向記憶體寫入資料89D8H時需要進行兩次資料傳送。
CPU對外部器件的控制是通過控制匯流排來進行的。
控制匯流排是一些不同控制線的集合。
有多少根控制匯流排,就意味著CPU提供了對外部器件的多少種控制。
所以,控制匯流排的寬度決定了CPU對外部器件的控制能力。
前面所講的記憶體讀或寫命令是由幾根控制線綜合發出的,其中有一根稱為“讀訊號輸出”的控制線負責由CPU向外傳送讀訊號,CPU向該控制線上輸出低電平表示將要讀取資料;有一根稱為“寫訊號輸出”的控制線則負責傳送寫訊號。
1.1~1.5 小 結
(1) 彙編指令是機器指令的助記符,同機器指令一一對應。
(2) 每一種CPU都有自己的彙編指令集。
(3) CPU可以直接使用的資訊在儲存器中存放。
(4) 在儲存器中指令和資料沒有任何區別,都是二進位制資訊。
(5) 儲存單元從零開始順序編號。
(6) 一個儲存單元可以儲存8個bit,即8位二進位制數。
(7) 1Byte=8bit 1KB=1024B 1MB=1024KB 1GB=1024MB
(8) 每一個CPU晶片都有許多管腳,這些管腳和匯流排相連。也可以說,這些管腳引出匯流排。一個
CPU可以引出3種匯流排的寬度標誌了這個CPU的不同方面的效能:地址匯流排的寬度決定了CPU的定址能力;
資料匯流排的寬度決定了CPU與其他器件進行資料傳送時的一次資料傳送量;
控制匯流排的寬度決定了CPU對系統中其他器件的控制能力。
1.6 記憶體地址空間
什麼是記憶體地址空間呢?
舉例來講,一個CPU的地址匯流排寬度為10,那麼可以定址1024個記憶體單元,這1024個可尋到的記憶體單元就構成這個CPU的記憶體地址空間。
下面進行深入討論。首先需要介紹兩部分基本知識,主機板和介面卡。
主機板
在每一臺pc機中,都有一個主機板,主機板上有核心器件和一些主要器件,這些器件通過匯流排(地址匯流排、資料匯流排、控制匯流排)相連。
這些器件有CPU、儲存器、外圍晶片組、擴充套件插槽等,擴充套件插槽上一般插有RAM記憶體條和各類介面卡。
介面卡
CPU對外部裝置都不能直接控制,如顯示器、音箱、印表機等。
直接控制這些裝置進行工作的是插在擴充套件插槽上的介面卡。擴充套件插槽通過匯流排和CPU相連,所以介面卡也通過匯流排同CPU相連。
CPU可以直接控制這些介面卡,從而實現CPU對外設的間接控制。
簡單地講,就是CPU通過匯流排向介面卡傳送命令,介面卡根據CPU的命令控制外設進行工作。
儲存器晶片
從讀寫屬性上看分為兩類:隨機儲存器(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, 一般稱為視訊記憶體。顯示卡隨時將視訊記憶體中的資料向顯示器上輸出。換句話說,我們將需要顯示的內容寫入視訊記憶體,就會出現在顯示器上。
上述的那些儲存器,在物理上是獨立的器件,但是在以下兩點上相同。
-
都和CPU的匯流排相連。
-
CPU對它們進行讀或寫的時候都通過控制線發岀記憶體讀寫命令。
CPU在操控它們的時候,把它們都當作記憶體來對待,把它們總的看作一個由若干儲存單元組成的邏輯儲存器,這個邏輯儲存器就是我們所說的記憶體地址空間。
在彙編這門課中,我們所面對的是記憶體地址空間。
在圖1.8中,所有的物理儲存器被看作一個由若干儲存單元組成的邏輯儲存器,每個物理儲存器在這個邏輯儲存器中佔有一個地址段,即一段地址空間。CPU在這段地址空間中讀寫資料,實際上就是在相對應的物理儲存器中讀寫資料。
記憶體地址空間的大小受CPU地址匯流排寬度的限制。
8086CPU的地址匯流排寬度為20, 可以傳送220個不同的地址資訊(大小從0至220—1)。即可以定位2^20個記憶體單元,則8086PC的記憶體地址空間大小為1MB。同理,80386CPU的地址匯流排寬度為32,則記憶體地址空間最大為4GB。
不同的計算機系統的記憶體地址空間的分配情況是不同的,圖1.9展示了8086PC機記憶體地址空間分配的基本情況。
圖1.9告訴我們,從地址0〜9FFFF的記憶體單元中讀取資料,實際上就是在讀取主隨機儲存器中的資料;向地址AOOOO-BFFFF的記憶體單元中寫資料,就是向視訊記憶體中寫入資料,這些資料會被顯示卡輸出到顯示器上;我們向地址C0000〜FFFFF的記憶體單元中寫入資料的操作是無效的,因為這等於改寫只讀儲存器中的內容。
最終執行程式的是CPU,我們用匯編語言程式設計的時候,必須要從CPU的角度考慮問題。對CPU來講,系統中的所有儲存器中的儲存單元都處於一個統一的邏輯儲存器中,它的容量受CPU定址能力的限制。這個邏輯儲存器即是我們所說的記憶體地址空間。