汇编基础一日一学习3

今天我们来学习下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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值