指令指針寄存器及其與指針寄存器的關(guān)系
指令指針寄存器EIP中存放下一條將要執(zhí)行指令的偏移量(offset ),這個(gè)偏移量是相對(duì)于目前正在運(yùn)行的代碼段寄存器CS而言的。偏移量加上當(dāng)前代碼段的基地址,就形成了下一條指令的地址。EIP中的低16位可以分開(kāi)來(lái)進(jìn)行訪問(wèn),給它起名叫指令指針I(yè)P寄存器,用于16位尋址。
指令指針寄存器ip,里面放置的是不是指令,而是一個(gè)指向下一個(gè)將要去獲取的指令的內(nèi)存地址(所以它是一個(gè)指針)。
它們的關(guān)系就是,CPU從指令指針寄存器ip 獲得指令的內(nèi)存地址,然后取出指令,放置到指令寄存器IR。接下來(lái),指令指針寄存器ip自己加1(也就是指向下一條指令)。
指令指針寄存器和指針寄存器的差異
指令指針寄存器
32位CPU把指令指針擴(kuò)展到32位,并記作EIP,EIP的低16位與先前CPU中的IP作用相同。
指令指針EIP、IP(InstrucTIon Pointer)是存放下次將要執(zhí)行的指令在代碼段的偏移量。在具有預(yù)取指令功
能的系統(tǒng)中,下次要執(zhí)行的指令通常已被預(yù)取到指令隊(duì)列中,除非發(fā)生轉(zhuǎn)移情況。所以,在理解它們的功能
時(shí),不考慮存在指令隊(duì)列的情況。
在實(shí)方式下,由于每個(gè)段的最大范圍為64K,所以,EIP中的高16位肯定都為0,此時(shí),相當(dāng)于只用其低16位
的IP來(lái)反映程序中指令的執(zhí)行次序。
指針寄存器
32位CPU有2個(gè)32位通用寄存器EBP和ESP。其低16位對(duì)應(yīng)先前CPU中的SBP和SP,對(duì)低16位數(shù)據(jù)的存取,不影
響高16位的數(shù)據(jù)。
寄存器EBP、ESP、BP和SP稱為指針寄存器(Pointer Register),主要用于存放堆棧內(nèi)存儲(chǔ)單元的偏移量,
用它們可實(shí)現(xiàn)多種存儲(chǔ)器操作數(shù)的尋址方式,為以不同的地址形式訪問(wèn)存儲(chǔ)單元提供方便。
指針寄存器不可分割成8位寄存器。作為通用寄存器,也可存儲(chǔ)算術(shù)邏輯運(yùn)算的操作數(shù)和運(yùn)算結(jié)果。
它們主要用于訪問(wèn)堆棧內(nèi)的存儲(chǔ)單元,并且規(guī)定:
BP為基指針(Base Pointer)寄存器,用它可直接存取堆棧中的數(shù)據(jù);
SP為堆棧指針(Stack Pointer)寄存器,用它只可訪問(wèn)棧頂。