CS寄存器和IP寄存器:
首先強調一下,這兩個寄存器非常非常重要,CS的全拼為“Code segment”,即代碼段寄存器,對應於內存中的存放代碼的內存區域,用來存放內存代碼段區域的入口地址(段基址)。
CPU在執行指令時,通過代碼寄存器CS和指令指針寄存器IP(instruction Pointer)來確定要執行的下一條指令的內存地址。
CS:IP 兩個寄存器指示了CPU當前要賭氣的指令地址,計算方式一般為CS左移4位然后加上IP寄存器,作為地址去取內容。
CPU的制造商會為這兩個寄存器設置出廠初始值,這2個初始值,其實就決定了第一條執行指令的地址,這是所有程序的源頭,沒有這個初始值,多么復雜精妙的程序都沒用,因為CPU壓根就不會鳥你。隨着X86的發展,第一條指令並不是一成不變的,
(1)8086:CPU reset后CS寄存器的值為0xFFFF,IP寄存器的值為0,所以將CS左移4位+IP,換算出的物理地址為0xFFFF0,這個地址就是
1MB往下16字節的位置。
(2)80286:CPU reset之后CS的只為0xF000,IP的只為0xFFF0,算法同樣是CS左移4位+IP,計算出的物理地址也是0xFFFF0
(3)80386:到了386年代,一切都變了,此時CPU reset后CS的只為0xF000,但是CS除了段選擇之外還有一個隱藏的基址寄存器,這個寄存
器的值為0xFFFF0000,IP的值仍然為0xFFF0,此時的計算算法也不是上面的左移4位了,而是0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0
,這個地址已經是很高的地址了,是4G往下16字節的位置。
PC是非intel廠家對IP的稱呼,也就是說PC起始跟CS:IP是一回事兒。