CS 暫存器 和 IP 暫存器

FrankYou發表於2018-03-23

下面將要介紹的是一組非常非常重要的暫存器,即 CS:IP 。

CS:IP 兩個暫存器指示了 CPU 當前將要讀取的指令的地址,其中  CS 為程式碼段暫存器,而   IP 為指令指標暫存器

什麼叫做指示了 CPU 當前將要讀取的指令呢?在 8086  CPU 中,為什麼  CPU  會自動的執行指令呢?

這些指令肯定是存放在記憶體中的,但是  CPU  怎麼知道這些指令存放在記憶體的那個位置呢?

比如,我有下面的兩條指令要執行:

    MOV AX,1234H
    MOV BX,AX

而假設這兩條指令在記憶體中存放為:

image

很顯然, 1000H:0000H 指向的是  MOV  AX,1234H  的首地址,

如果 CPU 要讀取到我的指令的話,很顯然,必須要知道地址  1000H:0000H ,

然後  CPU  就可以根據這個首地址,將彙編指令  MOV  AX,1234H  所對應的機器碼讀入到  CPU  的指令暫存器中

最後便可以在  CPU  中進行處理了。

但關鍵是   CPU  如何知道我的  1000H:0000H  這個首地址?其實這就需要使用到  CS:IP  這個暫存器組了 。

當我們執行一個可執行檔案時,很明顯,我們需要另外一個程式來將這個可執行檔案載入到記憶體當中,

關於這個載入可執行檔案的程式,我們在這裡不管他,點一下即可,

一般是通過作業系統的外殼程式(也就是傳說中的  Shell  程式),

Shell  將可執行檔案載入到記憶體中以後,就會設定  CPU  中的兩個暫存器,即設定  CS:IP  兩個暫存器指向可執行檔案的起始地址,此後  CPU  便從這個起始地址開始讀取記憶體中的指令,並且執行。

比如我們在寫彙編程式時,通常會使用  START  標記,其實這個標記就是用來標記起始地址的,

當將一個彙編程式編譯,連線成可執行檔案以後,再通過作業系統的  Shell  程式將可執行檔案載入到記憶體中以後,

這個  START  所標記處的地址就是整個可執行檔案的起始地址了 。

也就是說,當一個可執行檔案載入到記憶體中以後,CS:IP  兩個暫存器便指向了這個可執行檔案的起始地址,

然後  CPU  就可以從這個起始地址開始往下讀取指令,

當讀取完指令後,CS:IP  將會自動的改變,基本上是改變  IP ,從而指向下一條要讀取的指令,這樣就可以執行這個可執行檔案了 。

最後再對  CS:IP  總結一下:

  1. 你想讓  CPU  執行哪行指令,你就讓  CS:IP  指向儲存有指令的那塊記憶體即可。
  2. 任何時候,CS:IP  指向的地址中的內容都是  CPU  當前執行的指令。

相關文章