今天我們來學習下eip暫存器。不要小看這個暫存器。它可儲存著我們cpu要讀取指令的位址,沒有了它,cpu就無法讀取下面的指令(通俗點講cpu就無法執行)。如果玩過破解,跟蹤過程式的人都應該知道。每次相應彙編指令執行完相應的eip值就會增加。我大致描述一下這個暫存器的情況。
因為80386cpu的定址範圍是4gb。所以它的定址模式是平坦模式的。這裡我描述下cpu通過讀取eip暫存器執行的大致過程。。
此時我們假設乙個程式開始執行了。首先peloader裝載我們的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->
存放指令到指令緩衝區
->執行..
反覆迴圈
這裡還要介紹乙個jmp指令,大家都比較熟悉吧。。 但是你是否知道每次執行jmp後,eip的值的變化呢。其實你猜測也可以猜測到。jmp顧名思義 跳轉指令。執行後 eip的值=後面要跳轉的位址。
舉個例子:
假設之前eip = 00403021h ,執行jmp 00403058h 。執行完指令後eip = 00403058h
小作業:
1.假設目前的eip暫存器的值是
eip= 00400001h , 00400001h偏移處的彙編指令是mov ebp,esp,這個指令佔2個位元組。那麼執行完這句指令後,此時的eip值是多少?
2.執行以下幾句指令後,eip發生了幾次變化?
push
ebpadd ax,ax
mov ebp
3.執行以下語句後,eip發生了幾次變化?最後的eip值等於多少
push
ebpmov
ebp,esp
jmp
00405060h
彙編基礎一日一學習1
暫存器是什麼?大致說暫存器是cpu的部件 一般用於資訊儲存 也可以說暫存器是我們可以進行指令讀寫的部件。我們目前80386的cpu的每個暫存器是4個位元組的。也就是32位。也可以說80386cpu有32條位址線 8個通用暫存器eax ebx ecx edx esp ebp esi edi 也就是我們...
彙編基礎一日一學習5
那麼棧到底是什麼呢?棧是一種具有特殊的訪問方式的儲存空間。它的特殊就是在於最後進入這個空間的資料,最先出去。舉個例子,假如這時我們有3個動物。貓咪 猴子 兔子。那麼我們按先後的順序我們先把貓咪放進棧中,然後再把猴子放到棧中,最後把兔子放到棧中。那麼此時,大家可以看到。兔子現在存在棧頂。那麼此時我們取...
彙編基礎一日一學習6
執行時棧 runtimestack 我們通常稱為 堆疊 這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是執行時庫,它是我們程式執行時必須的庫。例如我們bcb中的vclrtl。我們的bcb程式必須依賴...