BP_scratch那段代码

CALL做了什么

那么一条CALL指令做了什么事情呢?它做的就是对CPU执行指令所需要的充要条件相关因素进行处理,从而保证下一条指令能够正确执行。CALL指令执行需要知道下一步调用的函数的地址(最简单跳转指令JMP需要知道的东东),而在它将CPU执行点给下一步需要执行的函数之前,需要先保存现有执行点的一些信息,最简单的就是CS、EIP和ESP寄存器(自然的,也就是遵守调用约定的,函数调用ESP由调用函数自动计算,可以不存储)。

diyblPic

图 2 执行CALL之前的寄存器和内存使用情况

假定CPU现有代码执行至004014A0时各寄存器的值如下:ESP(008B0010),EIP(004014A0),CS(0000)。如图2所示。为了方便描述,这里假定各条指令的长度都是4字节(远调用为8字节)。

那么执行CALL 004032A0后的各寄存器的值如下:ESP(008B000C),EIP(004032A0),CS(0000)。如图3所示。执行一次近调用后CALL指令会将EIP入栈,并同时更新ESP和EIP的值,由于是近调用,CS寄存器的值不变。

 diyblPic

图 3 执行near CALL之后的寄存器和内存使用情况

同理,执行完CALL 0300: 004032A0后的各寄存器值如下:ESP(008B0008),EIP(004032A0),CS(0300)。如图4所示。执行一次远调用后CALL指令会将CS和EIP依次入栈,并同时更新ESP、EIP和CS的值,下一条指令的执行地址由最新的EIP和CS计算出来。

 diyblPic

图 4 执行FAR CALL之后的寄存器和内存使用情况

4       RET干了些啥?

diyblPic

图 5 执行RET之后的寄存器和内存使用情况

与CALL指令相对的,RET指令主要进行出栈操作,并更新相应的寄存器。出栈指令RET有四种形式。

(1)       RET。可能是近返回也可能是远返回。

(2)       RETN。显式指定近返回。

(3)       RETF。显式指定远返回。

(4)       RET N。同(1),不过ESP另外减去N字节。

图5中给出了最简单的一种调用RET且为近返回调用后寄存器和内存的使用情况。


  /*
   * Calculate the delta between where we were compiled to run
   * at and where we were actually loaded at. This can only be done
   * with a short local call on x86. Nothing else will tell us what
   * address we are running at. The reserved chunk of the real-mode
   * data at 0x1e4 (defined as a scratch field) are used as the stack
   * for this calculation. Only 4 bytes are needed.
   */
    //计算编译时的连接地址与实际加载地址之间的差值。。。。计算时使用实模式数据段偏移在0x1e4
    //处的地址作为栈,这次计算只需要4个字节的栈就可以了!这里很是费解,把boot_params->scratch
    //作为堆栈使用。
    //将前边操作数的偏移地址赋值给esp,前边参数的地址为ds:(  (BP_scratch+4)(%esi) ),那他的偏移就是
    //(BP_scratch+4)(%esi),%esi里放的是boot_params。
    leal (BP_scratch+4)(%esi), %esp
    call 1f //根据前面对call的解释,知道,这里call先将1处的加载地址eip+4放入堆栈
1 : popl %ebp //ebp就是1:的实际地址
    subl $1b, %ebp //这里$1b是1处的连接地址,因为$1b是个标号,标号表示的都是连接地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值