彙編語言閱讀筆記【基礎知識】

1、參考

彙編語言-王爽程序員

2、概要

彙編語言是和具體的微處理器相聯繫的,每一種微處理器的彙編語言都不同,只能經過一種經常使用的、結構簡潔的微處理器的彙編語言進行學習,從而達到學習彙編語言的兩個根本目的:
(1)充分得到底層編程的體驗
(2)深入理解機器運行程序的機理編程

使用的以8086CPU爲中央處理器的PC機進行學習,由於:經常使用並且結構簡潔學習

3、基本知識

彙編語言的主體是彙編指令,彙編指令和機器指令的差異在於指令的表示方法上,彙編指令是機器指令便於記憶的書寫格式。spa

寄存器,簡單講是CPU中能夠存儲數據的器件,一個CPU中包含多個寄存器3d

計算機如何執行程序員用匯編指令編寫的程序呢?
(1)程序員用匯編語言寫出源程序;
(2)使用匯編編譯器將源程序編譯爲機器碼
(3)計算機執行機器碼指針

image.png

3.1 彙編語言的組成

彙編語言由三種指令組成:code

  1. 彙編指令:機器碼的助記符,有對應的機器碼;
  2. 僞指令:沒有對應的機器碼,由編譯器執行,計算機並不執行;
  3. 其餘符號,例如:+,-,*,/ 等,由編譯器識別,沒有對應的機器碼

3.2 指令和數據

CPU是計算機的核心部件,控制着整個計算機的運做、進行計算,CPU工做須要提供指令和數據(指令和數據保存在內存中,CPU能夠讀取和寫入)blog

指令和數據是應用上的概念,在內存和磁盤中,指令和數據沒有任何區別(都是二進制信息),CPU根據不一樣需求,把二進制信息解析爲指令和數據,賦予其不一樣意義。接口

內存被劃分爲若干個存儲單元,一個存儲單元能夠存儲一個Byte(字節)內存

CPU要想進行數據的讀寫,須要和外部器件(芯片)進行3類信息的交互:

(1)存儲單元的地址(地址信息);
(2)芯片的選擇,讀或者寫的命令(控制信息);
(3)讀或者寫的數據(數據信息)

計算機CPU和其餘芯片鏈接的導線稱爲總線(一根根導線的集合),根據傳送信息的不一樣,總線從邏輯上分爲3類:地址總線、控制總線、數據總線

地址總線:經過地址總線來指定存儲器單元
數據總線:CPU與內存或者其餘器件之間的數據傳送是經過數據總線進行的
控制總線:對外部器件的控制是經過控制總線進行的

CPU從3號單元讀取數據過程?

(1)CPU經過地址總線將地址信息(3單元)發出;
(2)CPU經過控制線發出內存讀命令,選中存儲器芯片,通知它,從中讀取數據;
(3)存儲器將(3單元)數據(8)經過數據線送入CPU中

CPU向3號單元寫入數據過程?

(1)CPU經過地址線將地址信息(單元3)發出;
(2)CPU經過控制線發出內存寫入命令,選中存儲器芯片,通知它,向其中寫入數據;
(3)CPU經過數據線將數據(26)寫入到內存的3單元中

一個CPU若是有n根地址線,則這個CPU的地址總線寬度爲n,最多能夠尋找2的n次方的內存單元(即2**n Byte)

數據總線的寬度決定了CPU和外界的數據傳送速度,8根數據總線一次能夠傳送一個8位二進制數據(1Byte),16根數據總線一次能夠傳送兩個字節(2Byte)

控制總線的寬度決定了CPU對外部器件的控制能力
內存讀或者寫命令是由幾根控制線綜合發出的,其中一根稱爲「讀信號輸出」的控制線負責由CPU向外傳送讀信號,CPU向該控制線上輸出低電平表示將要讀取數據;
有一根稱爲「寫信號輸出」的控制線負責傳送寫信號。

3.3 硬件描述

主板:每一個PC機中,都有一個主板,主板上有核心器件和一些主要器件,經過總線(3種)相鏈接,這些器件有CPU,存儲器,外圍芯片組,擴展插槽等等,擴展插槽中通常插有RAM內存條和各種接口卡

接口卡:直接控制外部設備(顯示器、音箱、打印機等)進行工做的是插在擴展插槽上的接口卡,CPU經過控制接口卡,實現CPU對外設的間接控制,即CPU經過總線向接口卡發送命令,接口卡根據CPU的命令控制外設進行工做。

存儲器芯片:一個PC機中,裝有多個存儲器芯片,從物理鏈接上,這些芯片是獨立的,不一樣的器件。從讀寫屬性,能夠分爲RAM(隨機存儲器)和ROM(只讀存儲器),從功能和鏈接上能夠分爲:
(1)隨機存儲器:存放CPU使用的絕大部分程序和數據,主隨機存儲器通常由兩個位置上的RAM組成,裝在主板上的RAM和插在擴展插槽上的RAM
(2)裝有BIOS (basic input/output system)的ROM
BIOS是由主板和各種接口卡(顯卡、網卡等)廠商提供的軟件系統,能夠經過它利用該硬件設備進行最基本的輸入輸出。
主板和某些接口卡上插有存儲對應的BIOS的ROM,例如:主板上的ROM中保存着主板的BIOS(系統BIOS),顯卡ROM上存儲着顯卡的BIOS,網卡ROM(若是安裝)存儲着網卡的BIOS

(3)接口卡的RAM,某些接口卡須要對大批量的輸入、輸出數據進行暫時存儲,在其上裝有RAM,最典型的是顯示卡上的RAM,通常稱爲顯存,顯示卡隨時將顯存中的數據向顯示器上輸出

image.png

3.4 內存地址空間

各類存儲器是獨立的器件,可是:
(1)都與CPU的總線相連;
(2)CPU對其進行讀或者寫都經過控制總線發出內存讀寫命令
CPU在操控這些存儲器時候,都把它們看成內存對待,當作是一個由若干個存儲單元組成的邏輯存儲器,即稱爲內存地址空間

image.png

每一個物理存儲器在這個邏輯存儲器中佔有一個地址段(一段地址空間),CPU在這段地址空間中讀寫數據,實際上就是在相對應的物理存儲器中讀寫數據。

內存地址空間的大小受CPU地址總線寬度的限制,

image.png

8086CPU地址總線寬度是20,即擁有2**20 1M的內存地址空間
80386CPU地址總線寬度是32,即擁有2**32 4G的內存地址空間

image.png
由圖可得,在8086PC機器中,
最初的640KB內存中讀取數據,實際上就是在讀取主隨機存儲器中的數據,
向隨後的128KB內存中寫入數據,就是向顯存中寫入數據,這些數據會被顯示卡輸出到顯示器上;向最後的256KB內存中寫入數據的操做是無效的,由於這等於要修改只讀存儲器的內容。

最終運行程序的是CPU,對於CPU來講,系統的全部存儲器的存儲單元都處於一個統一的邏輯存儲器中,其容量受到CPU尋址能力的限制,這個統一的邏輯存儲器,稱爲內存地址空間。

4、寄存器

一個典型的CPU由運算器、控制器、寄存器等器件構成,這些器件使用內部總線鏈接。
運算器:進行信息處理
寄存器:進行信息存儲
控制器:控制各類器件進行工做;

對於程序員,CPU的主要部件是寄存器,寄存器是CPU中程序員能夠用指令讀寫的部件,程序員經過改變各類寄存器中的內容實現對CPU的控制

4.1 通用寄存器

8086CPU的全部寄存器都是16位的,能夠存放兩個字節,AX BX CX DX這4個寄存器一般用來存放通常性的數據,稱爲通用寄存器

爲了保持兼容,8086CPU的4個通用寄存器能夠獨立使用8個8位寄存器表示

AX分爲AH AL
BX分爲BH BL
CX分爲CH CL
DX分爲DH DL
其中,AX的低8位構成了AL寄存器,高8位構成了AH寄存器

出於對兼容性的考慮,8086CPU能夠一次性處理兩種尺寸的數據
(1)字節,byte, 8bit, 保存在8位寄存器中
(2)字,word, 16bit, 保存爲2個字節,稱爲高位字節、低位字節

image.png

4.2 段寄存器CS

CS和IP是8086CPU中兩個最關鍵的寄存器,指示了CPU當前要讀取指令的地址,CS爲代碼段寄存器,IP爲指令指針寄存器,假設:任意時刻,CS中的內容爲M,IP中的內容是N,則CPU將從內存M*16 +N單元開始,讀取一條指令而且執行

在任意時刻,CPU將CS:IP指向的內容看成指令執行,工做過程簡單描述以下:
(1)從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩衝器;
(2)IP=IP+所讀取指令的長度,從而指向下一條指令;
(3)執行指令,轉到(1)重複

在8086CPU加電或者復位後(即CPU剛開始工做時候)CS和IP被設置爲CS=FFFFH, IP=0000H,即在機器剛剛啓動時候,CPU從內存FFFF0H單元中讀取指令執行,該指令爲開機後執行的第一條指令。

問:第三章中說到,在內存中,指令和數據沒有任何區別,都是二進制信息,CPU在工做時候如何判斷指令和數據呢?
答:CPU將CS:IP指向的內存單元中的內容看成指令,由於,在任什麼時候候,CS:IP中的內容看成指令的段地址和偏移地址,用它們合成指令的物理地址,到內存中讀取指令碼,執行。若是,內存中的一段信息被CPU執行過,則其所在的內存單元必然被CS:IP指向過。

問:如何修改CS,IP指令的值?
答:可以修改CS,IP的內容的指令被統稱爲轉移指令,例如:jmp指令

形式以下:
(1)jmp 段地址:偏移地址
用指令中給出的段地址修改CS,偏移地址修改IP

jmp 2AE3:3 執行後,CS=2AE3H, IP=0003H, CPU從2AE33H處讀取指令;
jmp 3:0B16 執行後,CS=0003H, IP=0B16H, CPU從00B46H處讀取指令

(2)jmp 某個合法寄存器
用寄存器中的值修改IP
jmp ax, 相似於 mov IP, ax 將ax寄存器中的值賦予IP

4.3 代碼段

對於8086PC機,能夠根據須要,將一組內存單元定義爲一個段,段的長度小於等於64KB, 存在一組地址連續、起始地址爲16的倍數的內存單元中

問:如何使得代碼段中的指令被執行呢?
答:將一段內存看成代碼段,僅僅是編程時候的一種方法,CPU只會認爲CS:IP指向所定義的內容爲指令,因此,若是讓CPU執行放在代碼段中的指令,須要將CS:IP指向所定義的代碼段中的第一條指令的首地址。

4.4 段寄存器DS

4.5 段寄存器SS

相關文章
相關標籤/搜索