組合語言-學習記錄(二)

走向風口的一頭豬發表於2020-11-22

教材:《組合語言-第四版》王爽老師

第二章

1、在CPU中

> 運算器進行資訊處理

> 暫存器進行資訊儲存

> 控制器控制各種器件進行工作

> 內部匯流排連線各種器件,在他們之間進行資料的傳送

2、暫存器:AX 、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

3、通用暫存器:AX、BX、CX、DX    通常用來存放一般性的資料 (8086CPU 16位)

【問】為什麼 AX = AH,AL ?

【答】因為8086CPU的上一代CPU中的暫存器都是8位的,為了保證相容,使原來基於上代CPU編寫的程式稍加修改就可以執行在8086之上,因此AX分為AH和AL

4、不同的CPU可以有不同的形成實體地址的方式。

CPU 通過地址匯流排送入儲存器的,必須是一個記憶體單元的實體地址。在CPU向地址匯流排上發出實體地址之前,必須要在內部先形成這個實體地址。

5、8086CPU採用一種在內部用兩位16位地址合成的方法來形成一個20位的實體地址

(1)CPU中的相關部件提供兩個 16位的地址,一個成為段地址,另一個成為偏移地址

(2)段地址和偏移地址通過內部匯流排送入一個稱為地址加法器的部件;

(3)地址加法器將兩個 16位地址合併為一個20位的實體地址;

(4)地址加法器通過內部匯流排將 20位實體地址送入輸入輸出控制電路

(5)輸入輸出控制電路將 20位實體地址送上地址匯流排

(6)20位實體地址被地址匯流排傳送到儲存器。

6、實體地址 = 段地址*16 + 偏移地址     <->    實體地址 = 基礎地址 + 偏移地址

7、段的劃分來自於CPU

1> 段的起始地址一定是 16的倍數

2> 偏移地址為 16位,16位地址的定址能力為 64KB,所以一個段的長度最大為 64KB

8、段暫存器    CS-程式碼段暫存器   IP-指令指標暫存器

在8086PC機中,任意時刻,設CS中的內容為M,IP中的內容為N,8086CPU將從記憶體M*16+N單元開始,讀取一條指令並執行

(1)初始狀態(CS:2000H, IP:0000H, CPU將從記憶體 2000H*16+0000H處讀取指令執行)

(2)CS、IP中的內容送入地址加法器(地址加法器完成:實體地址=段地址*16+偏移地址)

(3)地址加法器將實體地址送入輸入輸出控制電路

(4)輸入輸出控制電路將實體地址20000H送上地址匯流排

(5)從記憶體20000H單元開始存放的機器指令 B8 23 01 通過資料匯流排被送入 CPU

(6)輸入輸出控制電路將機器指令B8 23 01送入指令緩衝器

(7)IP中的值自動增加(注意:在資料送入指令緩衝器後IP才進行加的操作,並不是剛去取資料就進行加操作)

(8)執行控制器執行指令 B8 21 01(即 mov ax, 0123H)

(9)指令 B8 23 01被執行後 AX 中的內容為 0123H

9、mov指令不能用來設定 CS、IP的值,因為 8086CPU 沒有提供這樣的功能。

能夠改變 CS、IP 的內容的指令被統稱為轉移指令,例如 jmp

1>  jmp 段地址:偏移地址   (同時修改CS、IP的值) 

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

2>  jmp 某一合法暫存器  (僅修改 IP 的內容)

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

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

10、Debug的使用

1> Debug是 DOS、Windows 都提供的真實模式 (8086 方式) 程式的除錯工具。使用它,可以檢視 CPU 各種暫存器中的內容、記憶體的情況和在機器碼級跟蹤程式的執行

2> 常用Debug的功能

- R    檢視、改變CPU暫存器的內容    > r 檢視暫存器資訊       > r  ax 修改ax暫存器的資訊

- D    檢視記憶體中的內容    > d 段地址:偏移地址   列出從指令記憶體單元開始的128個記憶體單元的內容       > d  一進入debug後就是用d的話會顯示debug預設的地址處的內容       > d 1000:0 9 檢視10000 - 10009 的內容       > d 1000:0 0 檢視10000H的內容

- E    改寫記憶體中的內容    > e 1000:0 0 1 2 3 4 5 6 7 8 9 依次修改10000-10009的內容為0-9      > e 1000:10 採用提問的方式一個一個地改寫記憶體中的內容      > e 1000:0 1 'a' 2 'b' 3 'c' 向記憶體中寫入字元      > e 1000:0 b8 01 00 b9 02 00 01 c8 將機器碼寫入記憶體

- U    將記憶體中的機器指令翻譯成彙編指令    > u 1000:0 檢視從1000:0開始的記憶體單元中的機器指令所對應的彙編指令

- T    執行一條機器指令    > t  用來執行當前CS:IP指向的指令

- A    以彙編指令的格式在記憶體中寫入一條機器指令    > a  1000:0 從10000H開始寫入彙編指令

 

相關文章