EIP寄存器
EIP寄存器,用來存儲CPU要讀取指令的地址,CPU通過EIP寄存器讀取即將要執行的指令。每次CPU執行完相應的匯編指令之后,EIP寄存器的值就會增加。
一、因為80386 CPU的尋址范圍是4GB,所以它的尋址模式是平坦模式的。CPU通過讀取EIP寄存器執行匯編指令的大致過程如下:1. 首先PE loader裝載我們的PE文件,讀取PE文件的基地址和入口RVA地址(相對于基地址的偏移),并且讀取相應級表結構的值,然后將程序映射到內存;
2. 映射到內存以后,PE loader把返回的程序入口點給EIP寄存器賦值,然后通知CPU:我映射完了,你可以執行了。然后CPU通過將EIP的值傳送到輸入輸出電路,并送入相應的地址總線上,再通過EIP寄存器讀取EIP偏移地址中的二進制數據(通常為匯編指令),并傳送到數據總線上,最后傳送到指令緩沖區。
3. 傳送到指令緩沖區后,EIP會自動的增加其讀入指令的數量,以便往下執行。最后CPU執行控制器中地址指令緩沖區的指令并且往下執行。
?
CPU每次執行控制器讀取完,相應的就再通過EIP寄存器去進行下一次的讀取指令工作。每次CPU讀取指令到指令緩沖區,相應的EIP寄存器的值增加,增加大小的就是讀取指令的字節大小。
?
舉個例子:
假設程序的入口點為匯編指令:
? ? ? ? ? PUSH ? EBP ? ?(注:此時EIP寄存器+指令字節大小)
執行過程如下:
? ? ? ? ? CPU 讀取EIP寄存器值
? ? ? ? ? 來到EIP值的偏移
? ? ? ? ? 讀取PUSH?
? ? ? ? ? 存放指令到指令緩沖區?
? ? ? ? ? 執行
? ? ? ? ? 重新讀取EIP寄存器值
? ? ? ? ? .................反復循環
?二、執行完JMP指令后,EIP的值會直接變成后面要跳轉的地址。
?
舉個例子:
? ? ? ?假設之前EIP = 00403021h ,執行JMP ?00403058H 之后,EIP = 00403058H
總之,CPU每次執行指令都要先讀取EIP寄存器的值,然后定位EIP指向的內存地址(偏移地址),并且讀取匯編指令,最后執行。
總結
- 上一篇: python登录网页_Python如何爬
- 下一篇: python 可执行文件_python调