1. 程式人生 > >組合語言_第2章 暫存器

組合語言_第2章 暫存器

第2章 暫存器

一個典型的CPU 由運算器、控制器、暫存器 等器件構成,這些器件靠內部匯流排相連。在CPU中:

  • 運算器進行資訊處理;
  • 暫存器進行資訊儲存;
  • 控制器控制各種期間進行工作;
  • 內部匯流排連線各種器件,在它們之間進行資料的傳送;

2.1 通用暫存器

  • 通用暫存器:通常用來存放一般性的資料的暫存器。如8086CPU 中AX、BX、CX、DX 這4個暫存器【8086CPU中所有的暫存器都是16位的。】

    8086CPU 中AX、BX、CX、DX 都可分為2個獨立使用的8位暫存器來用:

  • AX: AH和AL;

  • BX: BH和BL;

  • CX: CH和CL;

  • DX: DH和DL; 在這裡插入圖片描述

2.2 字在暫存器中的儲存

  • 位元組:byte,一個位元組由8個bit組成。
  • 字: word,一個字由2個位元組組成,這2個位元組分別稱為高位位元組和低位位元組 在這裡插入圖片描述

2.3 幾條彙編指令 在這裡插入圖片描述 注:

  • 在寫一個彙編指令或一個暫存器名稱時不區分大小寫。
  • 16位的暫存器,當要寫入的資料超過16位時,最高位的資料無法寫入,僅能寫入低16位資料。
  • 在進行資料傳送和運算時,要注意指令的2個操作物件的位數應一致。 例:mov ax,bl (ax 為16位,bl 為8位 此指令是錯誤的)

2.4 實體地址 所有記憶體單元構成的儲存空間是一個一維的線性空間,每一個記憶體單元在這個空間中都有一個唯一的地址,即實體地址。

2.5 16位結構的CPU 16位結構(16位機、字長為16 位):

  • 運算器一次最多可以處理16位的資料;
  • 暫存器的最大寬度為16位;
  • 暫存器和運算器之間的通路為16位;

2.6 8086CPU給出實體地址的方法 8086CPU 有20位地址匯流排,即1MB定址能力。8086CPU 又是16位結構,在內部一次性處理、傳輸、暫時儲存的地址為16位。表現出的定址能力只有64KB. 在這裡插入圖片描述

  • 地址加法器 採用 實體地址= 段地址x16 + 偏移地址 的方法合成物理地址。
  • 例:8086CPU要訪問地址為123C8的記憶體單元 在這裡插入圖片描述

“段地址x16” 更為常用的說法是左移4位。一個數據的二進位制形式左移N位,相當於該資料乘以2的N次方。 即 一個數據的16進位制形式左移1位,相當於x16;X進位制的資料左移1位,相當於乘以X。

2.7 實體地址= 段地址x16 + 偏移地址 的本質含義

  • “實體地址= 段地址x16 + 偏移地址” 的本質含義:CPU在訪問記憶體時,用一個基礎地址(段地址x16)和一個相對於基礎地址的偏移地址相加,給出記憶體單元的實體地址。即 “基礎地址+偏移地址=實體地址”

2.8 段的概念 其實,記憶體並沒有分段,段的劃分來自於CPU,由於8086CPU 用“基礎地址(段地址x16)+偏移地址=實體地址”的方式給出記憶體單元的實體地址,使得我們可以用分段的方式來管理記憶體. 在這裡插入圖片描述 注意:

  • 段地址x16 必然是16的倍數,所以一個段的起始地址也一定是16的倍數;
  • 偏移地址為16位,16位地址的定址能力為64KB,所以一個短的長度最大為64KB.
  • 在8086 PC 中,資料在21F60H 記憶體單元中,表示為: ①資料存在記憶體 2000:1F60 單元中; ②資料存在記憶體的2000段中的1F60單元中;

2.9 段暫存器 段地址在8086CPU的段暫存器中存放。8086CPU 有4個段暫存器:CS、DS、SS、ES.

2.10 CS 和 IP **CS : 程式碼段暫存器;IP : 指令指標暫存器;**它們指示了CPU 當前要讀取指令的地址。 在8086PC機中,任意時刻,設CS中的內容為M,IP中的內容為N,8086 CPU將從記憶體 Mx16+N 單元開始,讀取一條指令並執行。即: CPU將 CS:IP 指向的內容當做指令執行。 - 8086CPU 讀取、執行一條指令的過程: 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

- 8086CPU 工作過程: ①從CS:IP 指向的記憶體單元讀取指令,讀取的指令進入指令緩衝器; ②IP=IP+所讀指令長度,從而指向嚇一條指令; ③執行指令。轉到步驟①重複這個過程;

CPU根據什麼將記憶體中的資訊看作指令? CPU將CS:IP 指向的記憶體單元中的內容看作指令,因為,在任何時候,CPU將CS、IP 中的內容當做指令的段地址和偏移地址,用它們合成指令的實體地址,到記憶體中讀取指令碼,執行。

2.11 修改CS、IP 的指令

程式設計師能夠用指令讀寫的部件只有暫存器,程式設計師可以通過改變暫存器中的內容實現對CPU的控制。 CPU從何處執行指令是由CS、IP 中的內容決定的,可以通過修改CS、IP 的內容來控制CPU執行目標指令。

  • mov 指令:傳送指令; mov ax,123 注:mov指令不能用於設定CS、IP的值。
  • jmp指令:轉移指令; 同時修改CS、IP的內容: jmp 段地址:偏移地址 (用指令中給出的段地址修改CS,偏移地址修改IP) 例:jmp 2AE3:3 僅修改IP 內容, jmp 某一合法暫存器 (指令功能:用暫存器中的值修改IP) 例:jmp ax

2.12 程式碼段

例: mov ax,0000 (B8 00 00) add ax,0123 (05 23 01) mov bx,ax (8B D8) jmp bx (FF E3) 這段長度為10 個位元組的指令,存放在123B0H~123B9H的一組記憶體單元中,我們就認為123B0H ~ 123B9H 這段記憶體是用來存放程式碼的,是一個程式碼段,它的段地址為123BH,長度為10個位元組。 要讓CPU執行我們放在程式碼段中的指令,必須要將CS:IP 指向所定義的程式碼段中的第一條指令的首地址。

預備知識:Debug的使用 ①什麼是Debug? Debug 是DOS、Windows 都提供的真實模式(8086 方式)程式的除錯工具。使用它,可以檢視CPU 各種暫存器中的內容、記憶體的情況 和 在機器碼級跟蹤程式的執行。 ②Debug 功能

命令 功能
R 檢視、改變CPU暫存器的內容
D 檢視記憶體中的內容
E 改寫記憶體中的內容
U 將記憶體中的機器指令翻譯成彙編指令
T 執行一條機器指令
A 以彙編指令的格式在記憶體中寫入一條機器指令

③進入Debug 參考https://blog.csdn.net/madao1234/article/details/82951640 ④ R 命令檢視CPU中各個暫存器中的內容 在這裡插入圖片描述 用R命令改變暫存器中的內容:用R+暫存器名 在這裡插入圖片描述 ⑤ D命令 檢視記憶體內容 d 段地址:偏移地址 的格式檢視 在這裡插入圖片描述 使用D命令,Debug將輸出3部分內容:

  • 中間是從指定地址開始的128個記憶體單元的內容,16進位制的格式輸出;(注意在每行的中間有一個“-”,它將每行的輸出分為2部分,便於檢視)

  • 左邊是每行的起始地址;

  • 右邊是每個記憶體單元中的資料對應的可顯示的ASCII碼字元;沒有對應可顯示的ACSII碼字元 用 . 代替

  • 在使用 d 段地址:偏移地址 之後,接著使用D命令,可列出後續的內容。

  • 指定D命令檢視範圍: d 段地址:起始偏移地址 結尾偏移地址 , d 1000:0 9 檢視 1000:0 ~ 1000:9的內容。 在這裡插入圖片描述

⑥E 命令 改寫記憶體中的內容 在這裡插入圖片描述

可以用E命令逐個修改某一地址開始的記憶體單元的內容 :

  • e 1000:1
  • Debug 顯示起始地址1000:1 和第一個單元的原始內容,然後游標停在“ . ” 的後面提示輸入想要寫入的資料,輸入資料改寫當前記憶體單元 ,不輸入直接按空格則不修改記憶體單元
  • 當前單元處理完成後 (按了空格鍵表示處理完成),Debug 將接著顯示下一個記憶體單元的內容, 所有改寫完成後,按Enter ,E命令操作結束。 在這裡插入圖片描述

⑦ e命令寫入機器碼 ,U命令檢視機器碼含義,T命令執行記憶體中的機器碼 在這裡插入圖片描述 在這裡插入圖片描述

⑧ A命令 以彙編指令的形式在記憶體中寫入機器指令 在這裡插入圖片描述

To be continue…