下面將要介紹的是一組非常非常重要的暫存器,即 CS:IP 。
CS:IP 兩個暫存器指示了 CPU 當前將要讀取的指令的地址,其中 CS 為程式碼段暫存器,而 IP 為指令指標暫存器 。
什麼叫做指示了 CPU 當前將要讀取的指令呢?在 8086 CPU 中,為什麼 CPU 會自動的執行指令呢?
這些指令肯定是存放在記憶體中的,但是 CPU 怎麼知道這些指令存放在記憶體的那個位置呢?
比如,我有下面的兩條指令要執行:
MOV AX,1234H
MOV BX,AX
而假設這兩條指令在記憶體中存放為:
很顯然, 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 總結一下:
- 你想讓 CPU 執行哪行指令,你就讓 CS:IP 指向儲存有指令的那塊記憶體即可。
- 任何時候,CS:IP 指向的地址中的內容都是 CPU 當前執行的指令。