eip寄存器存儲着我們cpu要讀取指令的地址,沒有了它,cpu就無法讀取下面的指令(通俗點講cpu就無法執行。每次相應匯編指令執行完相應的eip值就會增加。
因為80386 cpu的尋址范圍是4GB。所以它的尋址模式是平坦模式的。這里我描述下cpu通過讀取eip寄存器執行的大致過程。。
此時我們假設一個程序開始執行了。首先PE loader裝載我們的pe文件,讀取我們pe文件的基地址和入口RVA地址(相對於基地址的偏移),並且讀取相應節表結構的值,然后將我們的程序映射到內存。
此時,映射到內存以后.. 此時PE loader把返回的程序入口點給cpu的eip寄存器賦值,然后通知我們的cpu:“ 並且說:我映射完了,你可以執行了。eip也相應的賦值了。此時cpu知道了eip的值,那么它通過將eip的值傳送到輸入輸出電路,並送入相應的地址總線上。那么此時cpu就通過eip讀取eip偏移上的二進制數據(我這里用匯編指令來表示)並傳送到數據總線上,最后傳送到指令緩沖區。傳送到指令緩沖區后,那么此時eip會自動的增加其讀入指令的數量,以便往下執行, 最后執行控制器第七指令緩沖區的指令並且往下執行。
我們cpu每次執行控制器讀取完,相應的就在通過eip寄存器去進行下一次的讀取指令工作。。每次cpu讀取指令到指令緩沖區,相應的eip寄存器的值增加,增加大小的就是讀取指令的字節大小(也可以說是長度)。。
舉個例子 我們程序的入口點是
push ebp 這個匯編指令。
(注:此時eip+ 讀取指令的大小)
首先cpu - > 讀取eip - > 來到eip值的偏移 - > 讀取push ebp -> 存放指令到指令緩沖區 - > 執行.. 反復循環
現在大家知道eip的作用性了吧。每次cpu執行都要先讀取eip寄存器的值,然后定位eip指向的內存地址,並且讀取匯編指令,最后執行。
這里還要介紹一個jmp指令,大家都比較熟悉吧。。 但是你是否知道每次執行jmp 后,eip的值的變化呢。其實你猜測也可以猜測到。jmp顧名思義 跳轉指令。執行后 eip的值=后面要跳轉的地址。
舉個例子:
假設之前eip = 00403021h ,執行jmp 00403058h 。執行完指令后eip = 00403058H
https://www.cnblogs.com/johnpher/archive/2011/05/28/2570683.html