下面將要介紹的是一組非常非常重要的寄存器,即 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 當前執行的指令。