汇编基础一日一学习3

来源:互联网 发布:usb加密狗复制软件 编辑:程序博客网 时间:2024/04/30 12:06
今天我们来学习下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->  存放指令到指令缓冲区    ->执行..  反复循环






  现在大家知道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  00405060h
0 0
原创粉丝点击