彙編語言 | 第二章 寄存器

一個典型的CPU由運算器、控制器、寄存器(CPU工作原理)等器件構成。

在CPU中:

  • 運算器進行信息處理;
  • 寄存器進行信息存儲;
  • 控制器控制各種器件進行工作;
  • 內部總線連接各種器件、在它們之間進行數據的傳送。

寄存器是CPU中程序員可以用指令讀寫的部件,可以通過改變各種寄存器中的內容實現對CPU的控制。

8086有14個寄存器,每個寄存器有一個名稱,分別有:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

1、通用寄存器

8086CPU的所有寄存器都是16位的,可以存放兩個字節。AX、BX、CX、DX這四個存儲器通常用來存放一般數性的數據,被稱爲通用寄存器。

AX寄存器的邏輯結構:

8086CPU的4個通用寄存器爲向前兼容,都可分爲兩個可獨立使用的8位寄存器用:

  • AX可分爲AH和AL;
  • BX可分爲BH和BL;
  • CX可分爲CH和CL;
  • DX可分爲DH和DL。

AX的低8位(0位~7位)構成了AL寄存器,高8位(8位~15位)構成了AH寄存器。這兩個寄存器都是可獨立使用的8位寄存器。

2、字在寄存器中的存儲

8086CPU可以一次性處理以下兩種尺寸的數據:

字節:記爲byte,一個字節由8個bit組成,可以存放在8位寄存器中。

字:記爲word,一個字由兩個字節組成,這兩個字節分別稱爲這個字的高位字節和低位字節。

一個字可以存在一個16位寄存器中,這個字的高位字節和低位字節就存在寄存器的高8位寄存器和低8位寄存器中。

3、幾條彙編指令

通過彙編指令控制CPU進行工作,如下是幾條指令:

計算16進制相加時,逢十六進一 。其中1~9與十進制表示相同,10~15用A、~F表示。也就是10=A,11=B。

4、物理地址

CPU訪問內存單元時,要給出內存單元的地址。所有內存單元構成的存儲空間是一個一維的線性空間,每個內存單元在這個空間中都有唯一的的地址,稱爲物理地址。

CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。在CPU向地址總線上發出物理地址之前,必須要先在內部形成這個物理地址。

5、16位結構的CPU

8086的16位結構(16位機、字長16位等說法與16位結構含義相同),描述了一個CPU具有幾方面的結構特性:

  • 運算器一次最多可以處理16位的數據;

  • 寄存器的最大寬度爲16位;
  • 寄存器和運算器之間的通路爲16位。

6、8086CPU給出物理地址的方法

8086CPU相關部件的邏輯結構:

當8086CPU要讀寫內存時:

  1. CPU中相關部件提供兩個16位的地址,一個稱爲段地址,一個爲偏移地址;
  2. 段地址和偏移地址通過內部總線送入一個稱爲地址加法器的部件;
  3. 地址加法器將兩個16位地址合成爲一個20位的物理地址;
  4. 地址加法器通過內部總線將20位物理地址送入輸入輸出控制電路;
  5. 輸入輸出控制電路將20位物理地址送上地址總線;
  6. 20位物理地址被地址總線傳送到存儲器。 

地址加法器採用:物理地址=段地址x16+偏移地址的方法合成物理地址。

段地址x16:左移4位,值的是二進制位。對於16進制數據x10

7、段地址x16+偏移地址=物理地址的本質含義

本質含義是:CPU在訪問內存時,用一個基礎地址(段地址x16)和一個相對於基礎的偏移地址相加,給出內存單元的物理地址。

8、段的概念

內存並沒有分段,段的劃分來自於CPU。由於8086CPU用“基礎地址(段地址x16)+偏移地址 = 物理地址”的方式給出內存單元的物理地址,可以用分段的方式管理內存。可以認爲:地址10000H~100FFH的內存單元組成一個段,該段的起始地址(基礎地址)爲10000H,大小爲100H。

在8086PC機中,存儲單元的地址用兩個元素來描述,即段地址和偏移地址。

列如物理地址21F60H描述爲:(1)數據存在內存2000:1F60單元中;(2)數據存在內存的2000H段中的1F60H中。

9、段寄存器

段地址在8086CPU的段寄存器中存放。有四個段寄存器:CS、DS、SS、ES。當8086CPU要訪問內存時由這4個段寄存器提供的內存單元的段地址。

10、CS和IP

CS和IP是8086CPU中最關鍵的寄存器。它們指示了CPU當前要讀取指令的地址。

CS爲代碼段寄存器,IP爲指令指針寄存器。

任意時刻,設CS中的內容爲M,IP中的內容爲N,8086CPU將從內存MX16+N單元開始,讀取一條指令並執行。也可以說,CPU將CS:IP指向的內容當作指令執行。

8086CPU:

  • 從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩衝器;
  • IP=IP+所讀取指令的長度,從而指向下一條指令;
  • 執行指令。轉到步驟(1),重複這個過程。

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

CPU將CS:IP指向的內存單元中的內容看作指令。

11、修改CS、IP的指令

8086CPU大部分寄存器的值,都可以用mov指令來改變,mov指令被稱爲傳送指令。但是,mov指令不能用於設置CS、IP,8086CPU沒有提供這樣的功能,但是爲CS、IP提供了另外的指令來改變它們的值。能夠改變CS、IP的內容的指令被轉移指令。最簡單的可以修改CS、IP的指令:jmp指令。

同時修改CS、IP的內容,形如“jmp段地址:偏移地址”的指令完成。如:

jmp 2AE3:3  執行後:CS=2AE3H,IP=0003H,CPU將從2AE33H處讀取指令。

“jmp 段地址:偏移地址”指令功能爲:用指令中給出的段地址修改CS,偏移地址修改IP。

  僅修改IP的內容:“jmp 某一合法寄存器”,如:

jmp ax, 指令執行前:ax=100H ,CS= 2000H,IP=0003H

指令執行後:ax=1000H ,CS=2000H,IP=1000H

12、代碼段

可根據需要,將一組內存單元定義爲一個段。若要CPU執行在代碼段中的指令,必須要將CS:IP指向所定義的代碼段中的第一條指令的首地址。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章