組合語言_第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…