x86 CS IP

來源:互聯網
上載者:User

[CS IP]

2.10  CS和IP(1)

CS和IP是8086CPU中兩個最關鍵的寄存器,它們指示了CPU當前要讀取指令的地址。CS為程式碼片段寄存器,IP為指令指標寄存器,從名稱上我們可以看出它們和指令的關係。

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

也可以這樣表述:8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。

圖2.10展示了8086CPU讀取、執行指令的工作原理(圖中只包括了和所要說明的問題密切相關的組件,圖中數字都為十六進位)。

 
圖2.10  8086PC讀取和執行指令的相關組件

圖2.10說明如下。

(1) 8086CPU目前狀態:CS中的內容為2000H,IP中的內容為0000H;

(2) 記憶體20000H~20009H單元存放著可執行檔機器碼;

(3) 記憶體20000H~20009H單元中存放的機器碼對應的彙編指令如下。

地址:20000H~20002H,內容:B8 23 01,長度:3Byte,對應彙編指令:mov ax,0123H

地址:20003H~20005H,內容:BB 03 00,長度:3Byte,對應彙編指令:mov bx,0003H

地址:20006H~20007H,內容:89 D8,長度:2Byte,對應彙編指令:mov ax,bx

地址:20008H~20009H,內容:01 D8,長度:2Byte,對應彙編指令:add ax,bx

下面的一組圖(圖2.11~圖2.19),以圖2.10描述的情況為初始狀態,展示了8086CPU讀取、執行一條指令的過程。注意每幅圖中發生的變化(下面對8086CPU的描述,是在邏輯結構、宏觀過程的層面上進行的,目的是使讀者對CPU工作原理有一個清晰、直觀的認識,為組合語言的學習打下基礎。其中隱蔽了CPU的物理結構以及具體的工作細節)。

 
圖2.11  初始狀態(CS:2000H,IP:0000H,CPU將從
記憶體2000H×16+0000H處讀取指令執行)
 
圖2.12  CS、IP中的內容送入地址加法器(地址加法
器完成:物理地址=段地址×16+位移地址)

 
圖2.13  地址加法器將物理地址送入輸入輸出控制電路
 
圖2.14  輸入輸出控制電路將物理地址20000H送上地址匯流排
 
圖2.15  從記憶體20000H單元開始存放的
機器指令B8 23 01通過資料匯流排被送入CPU
 
圖2.16  輸入輸出控制電路將機器指令B8 23 01送入指令緩衝器
 
圖2.17  IP中的值自動增加

(讀取一條指令後,IP中的值自動增加,以使CPU可以讀取下一條指令。因當前讀入的指令B82301

長度為3個位元組,所以IP中的值加3。此時,CS:IP指向記憶體單元2000:0003。)

2.10 CS和IP(2)

 
圖2.18  執行控制器執行指令B8 23 01(即mov ax,0123H)
 
圖2.19  指令B8 23 01被執行後AX中的內容為0123H

(此時,CPU將從記憶體單元2000:0003處讀取指令。)

下面的一組圖(圖2.20~圖2.26),以圖2.19的情況為初始狀態,展示了8086CPU繼續讀取、執行3條指令的過程。注意IP的變化(下面的描述中,隱蔽了讀取每條指令的細節)。

 
圖2.20  CS:2000H,IP:0003H(CPU將從記憶體2000H×16+0003H處讀取指令BB 03 00)
 
圖2.21  CPU從記憶體20003H處讀取指令BB 03 00入指令緩衝器(IP中的值加3)
 
圖2.22  執行指令BB 03 00(即mov bx,0003H)
 
圖2.23  CPU從記憶體20006H處讀取指令89 D8入指令緩衝器(IP中的值加2)

 

 
圖2.24  執行指令89 D8(即mov ax,bx)後,AX中的內容為0003H
 
圖2.25  CPU從記憶體20008H處讀取指令01 D8入指令緩衝器(IP中的值加2)
 
圖2.26  執行指令01 D8(即add ax,bx)後,AX中的內容為0006H

通過上面的過程展示,8086CPU的工作過程可以簡要描述如下。

(1) 從CS:IP指向的記憶體單元讀取指令,讀取的指令進入指令緩衝器;

(2) IP=IP+所讀取指令的長度,從而指向下一條指令;

(3) 執行指令。轉到步驟(1),重複這個過程。

在8086CPU加電啟動或複位後(即CPU剛開始工作時)CS和IP被設定為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,CPU從記憶體FFFF0H單元中讀取指令執行,FFFF0H單元中的指令是8086PC機開機後執行的第一條指令。

現在,我們更清楚了CS和IP的重要性,它們的內容提供了CPU要執行指令的地址。

我們在第1章中講過,在記憶體中,指令和資料沒有任何區別,都是二進位資訊,CPU在工作的時候把有的資訊看作指令,有的資訊看作資料。現在,如果提出一個問題:CPU根據什麼將記憶體中的資訊看作指令?如何回答?我們可以說,CPU將CS:IP指向的記憶體單元中的內容看作指令,因為,在任何時候,CPU將CS、IP中的內容當作指令的段地址和位移地址,用它們合成指令的物理地址,到記憶體中讀取指令碼,執行。如果說,記憶體中的一段資訊曾被CPU執行過的話,那麼,它所在的記憶體單元必然被CS:IP指向過。

2.11  修改CS、IP的指令

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

我們如何改變CS、IP的值呢?顯然,8086CPU必須提供相應的指令。我們如何修改AX中的值?可以用mov指令,如mov ax,123將ax中的值設為123,顯然,我們也可以用同樣的方法設定其他寄存器的值,如mov bx,123,mov cx,123,mov dx,123等。其實,8086CPU大部分寄存器的值,都可以用mov指令來改變,mov指令被稱為傳送指令。

但是,mov指令不能用於設定CS、IP的值,原因很簡單,因為8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值。能夠改變CS、IP的內容的指令被統稱為轉移指令(我們以後會深入研究)。我們現在介紹一個最簡單的可以修改CS、IP的指令:jmp指令。

若想同時修改CS、IP的內容,可用形如"jmp段地址:位移地址"的指令完成,如

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

jmp 3:0B16,執行後:CS=0003H,IP=0B16H,CPU將從00B46H處讀取指令。

"jmp 段地址:位移地址"指令的功能為:用指令中給出的段地址修改CS,位移地址修改IP。

若想僅修改IP的內容,可用形如"jmp 某一合法寄存器"的指令完成,如

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

"jmp 某一合法寄存器"指令的功能為:用寄存器中的值修改IP。

jmp ax,在含義上好似:mov IP,ax。

注意,我們在適當的時候,會用已知的彙編指令的文法來描述新學的彙編指令的功能。採用一種"用彙編解釋彙編"的方法來使讀者更好地理解彙編指令的功能,這樣做有助於讀者進行知識的相互融會。要強調的是,我們是用"已知的彙編指令的文法"進行描述,並不是用"已知的彙編指令"來描述,比如,我們用mov IP,ax來描述jmp ax,並不是說真有mov IP,ax這樣的指令,而是用mov指令的文法來說明jmp指令的功能。我們可以用同樣的方法描述jmp 3:01B6的功能:jmp 3:01B6 在含義上好似mov CS,3  mov IP,01B6。

記憶體中存放的機器碼和對應的彙編指令情況2.27所示,設CPU初始狀態:CS=2000H,IP=0000H,請寫出指令執行序列。思考後看分析。

 
圖2.27  記憶體中存放的機器碼和對應的彙編指令

分析:

CPU對圖2.27中的指令的執行過程如下。

(1) 當前CS=2000H,IP=0000H,則CPU從記憶體2000H×16+0=20000H處讀取指令,讀入的指令是:B8 22 66(mov ax,6622H),讀入後IP=IP+3=0003H;

(2) 指令執行後,CS=2000H,IP=0003H,則CPU從記憶體2000H×16+0003H =20003H處讀取指令,讀入的指令是:EA 03 00 00 10(jmp 1000:0003),讀入後IP=IP+5=0008H;

(3) 指令執行後,CS=1000H,IP=0003H,則CPU從記憶體1000H×16+0003H =10003H處讀取指令,讀入的指令是:B8 00 00(mov ax,0000),讀入後IP=IP+3=0006H;

(4) 指令執行後,CS=1000H,IP=0006H,則CPU從記憶體1000H×16+0006H =10006H處讀取指令,讀入的指令是:8B D8(mov bx,ax),讀入後IP=IP+2=0008H;

(5) 指令執行後,CS=1000H,IP=0008H,則CPU從記憶體1000H×16+0008H =10008H處讀取指令,讀入的指令是:FF E3(jmp bx),讀入後IP=IP+2=000AH;

(6) 指令執行後,CS=1000H,IP=0000H,CPU從記憶體10000H處讀取指令……

經分析後,可知指令執行序列為:

(1) mov ax,6622H

(2) jmp 1000:3

(3) mov ax,0000

(4) mov bx,ax

(5) jmp bx

(6) mov ax,0123H

(7) 轉到第3步執行

2.12  程式碼片段(1)

前面講過,對於8086PC機,在編程時,可以根據需要,將一組記憶體單元定義為一個段。我們可以將長度為N(N≤64KB)的一組代碼,存在一組地址連續、起始地址為16的倍數的記憶體單元中,我們可以認為,這段記憶體是用來存放代碼的,從而定義了一個程式碼片段。比如,將:

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並不會由於這種安排,就自動地將我們定義的程式碼片段中的指令當作指令來執行。CPU只認被CS:IP指向的記憶體單元中的內容為指令。所以,要讓CPU執行我們放在程式碼片段中的指令,必須要將CS:IP指向所定義的程式碼片段中的第一條指令的首地址。對於上面的例子,我們將一段代碼存放在123B0H~123B9H記憶體單元中,將其定義為程式碼片段,如果要讓這段代碼得到執行,可設CS=123BH、IP=0000H。

2.9~2.12  小結

(1) 段地址在8086CPU的段寄存器中存放。當8086CPU要訪問記憶體時,由段寄存器提供記憶體單元的段地址。8086CPU有4個段寄存器,其中CS用來存放指令的段地址。

(2) CS存放指令的段地址,IP存放指令的位移地址。

8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。

(3) 8086CPU的工作過程:

① 從CS:IP指向的記憶體單元讀取指令,讀取的指令進入指令緩衝器;

② IP指向下一條指令;

③ 執行指令。(轉到步驟①,重複這個過程。)

(4) 8086CPU提供轉移指令修改CS、IP的內容。

檢測點2.3

下面的3條指令執行後,CPU幾次修改IP?都是在什麼時候?最後IP中的值是多少?

mov ax,bx
sub ax,ax
jmp ax

實驗1  查看CPU和記憶體,用機器指令和彙編指令編程

1. 預備知識:Debug的使用

我們以後所有的實驗中,都將用到Debug程式,首先學習一下它的主要用法。

(1) 什麼是Debug?

Debug是DOS、Windows都提供的實模式(8086方式)程式的調試工具。使用它,可以查看CPU各種寄存器中的內容、記憶體的情況和在機器碼級跟蹤程式的運行。

(2) 我們用到的Debug功能。

用Debug的R命令查看、改變CPU寄存器的內容;
用Debug的D命令查看記憶體中的內容;
用Debug的E命令改寫記憶體中的內容;
用Debug的U命令將記憶體中的機器指令翻譯成彙編指令;
用Debug的T命令執行一條機器指令;
用Debug的A命令以彙編指令的格式在記憶體中寫入一條機器指令。

Debug的命令比較多,共有20多個,但這6個命令是和彙編學習密切相關的。在以後的實驗中,我們還會用到一個P命令。

(3) 進入Debug。

Debug是在DOS方式下使用的程式。我們在進入Debug前,應先進入到DOS方式。用以下方式可以進入DOS。

① 重新啟動電腦,進入DOS方式,此時進入的是實模式的DOS。

② 在Windows中進入DOS方式,此時進入的是虛擬8086模式的DOS。

下面說明在Windows 2000中進入Debug的一種方法,在Windows 98中進入的方法與此類似。

選擇【開始】菜單中的【運行】命令,2.28所示,開啟【運行】對話方塊,2.29所示,在文字框中輸入"command"後,單擊【確定】按鈕。

 
圖2.28  選擇【運行】命令
 
圖2.29  在文字框中輸入"command"

進入DOS方式後,如果顯示為視窗方式,可以按下Alt+Enter鍵將視窗變為全屏方式。然後運行Debug程式,2.30所示,這個程式在Windows 98中通常在c:/windows98/command下,在Windows 2000中通常在c:/winnt/system下。由於系統指定了搜尋路徑,所以在任何一個路徑中都可以運行。

 
圖2.30  運行Debug程式

(4) 用R命令查看、改變CPU寄存器的內容。

我們已經知道了AX、BX、CX、DX、CS、IP這6個寄存器,現在看一下它們之中的內容,2.31所示。其他寄存器如SP、BP、SI、DI、DS、ES、SS、標誌寄存器等我們先不予理會。

 
圖2.31  使用R命令查看CPU中各個寄存器中的內容

注意CS和IP的值,CS=0CA2,IP=0100,也就是說,記憶體0CA2:0100處的指令為CPU當前要讀取、執行的指令。在所有寄存器的下方,Debug還列出了CS:IP所指向的記憶體單元處所存放的機器碼,並將它翻譯為彙編指令。可以看到,CS:IP所指向的記憶體單元為0CA2:0100,此處存放的機器碼為02 75 48,對應的彙編指令為ADD DH,[DI+48](這條指令的含義我們還不知道,先不必深究)。

Debug輸出的右下角還有一個資訊:"DS:0048=0",我們以後會進行說明,這裡同樣不必深究。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.