下面將要介紹的是一組很是很是重要的寄存器,即 CS:IP 。編程
CS:IP 兩個寄存器指示了 CPU 當前將要讀取的指令的地址,其中 CS 爲代碼段寄存器,而 IP 爲指令指針寄存器 。spa
什麼叫作指示了 CPU 當前將要讀取的指令呢?在 8086 CPU 中,爲何 CPU 會自動的執行指令呢?操作系統
這些指令確定是存放在內存中的,可是 CPU 怎麼知道這些指令存放在內存的那個位置呢?指針
好比,我有下面的兩條指令要執行:blog
MOV AX,1234H
MOV BX,AX
而假設這兩條指令在內存中存放爲:內存
很顯然, 1000H:0000H 指向的是 MOV AX,1234H 的首地址,get
若是 CPU 要讀取到個人指令的話,很顯然,必需要知道地址 1000H:0000H ,it
而後 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 總結一下: