今天我們來學習下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
小作業:
1.假設目前的eip寄存器的值是 eip = 00400001h , 00400001h偏移處的匯編指令是mov ebp, esp,這個指令占2個字節。那么執行完這句指令后,此時的eip值是多少?
2.執行以下幾句指令后,eip發生了幾次變化?
push ebp
add ax,ax
mov ebp
3.執行以下語句后,eip發生了幾次變化?最后的eip值等於多少
push ebp
mov ebp, esp
jmp 00405060hs
