• EIP寄存器


      今天我们来学习下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

  • 相关阅读:
    [android] 获取系统的联系人信息
    [android] 内容观察者
    [nodejs] nodejs开发个人博客(六)数据分页
    [android] 插入一条记录到系统短信应用里
    [android] 短信的备份
    [android] 内容提供者实现
    [android] 内容提供者简介
    [nodejs] nodejs开发个人博客(五)分配数据
    [android] 常用数据适配器SimpleAdapter
    [android] 常用数据适配器ArrayAdapter
  • 原文地址:https://www.cnblogs.com/johnpher/p/2570683.html
Copyright © 2020-2023  润新知