EIP寄存器——详解(for me)
来源:互联网 发布:java 高并发高可用 编辑:程序博客网 时间:2024/06/04 18:21
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指向的内存地址(偏移地址),并且读取汇编指令,最后执行。
- EIP寄存器——详解(for me)
- EIP寄存器
- EIP寄存器
- EIP寄存器
- EIP寄存器
- eip寄存器 介绍
- cpu 寄存器 esp ebp eip
- (三)EIP的改进之——采购单
- (四)EIP的改进之——替代料
- x86—EFLAGS寄存器详解
- x86—EFLAGS寄存器详解
- x86—EFLAGS寄存器详解
- x86—EFLAGS寄存器详解
- x86—EFLAGS寄存器详解
- x86—EFLAGS寄存器详解
- 程序的工作过程 eip寄存器
- 关于EIP、EBP和ESP寄存器
- 爱靓颖—Don't cry for me Argentina
- Hibernate 级联删除
- find.cpp
- 在android中添加背景图片
- 为DataGridView增加行号
- SuperMap iServer Java6R 启动iserver服务出错
- EIP寄存器——详解(for me)
- tomcat 集群学习笔记
- 卢梭:人无往不在枷锁之中
- perl应用:从NCBI提供的信息中获取需要的序列(上)use Arrays
- 我看懂的设计模式 Factory Method工厂方法
- 解决”/usr/bin/ld cannot find -lssl“问题
- 实现下拉框可编辑
- 使用jsp运用mysql数据库时遇到的问题
- tomcat 出现 OutOfMemoryError : PermGen space