zoukankan      html  css  js  c++  java
  • C 汇编代码 函数调用指令和栈平衡

    1. CALL指令:
      CALL指令可不是如唤指令,而是子程序调用指令。那么汇编语言中的子程序是什么呢?子程序能被其它程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证得新返回到调用它的程序中去。也可调用其它子程序,甚至可自身调用。
      我们可以暂时把子程序理解为一个代码段,是一个模块化的代码面。这个代码段可以完成某一特定功能,当程序在执行过程中需要用到这一功能,将会进入这个代码段。这块代码段执行完毕后,会跳出这块代码段。而进入代码段这一过程就是子程序的调用,也就是这里所说的CALL指令所要完成的工作。
      反汇编经常看到的CALL指令的基本格式如下:
      CALL   地址1
      功能:调用地址1处的子程序
      CALL指令分为两种情况,一种是段内转移;另一种是段间转移。这两种情况类似于JMP指令的相对跳转和绝对跳转(只不过相对跳转的JMP指令会有short标识)。
      在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。
      (1)段内转移的CALL指令等价于两条指令:
      push eip
      jmp   目的位置
      也就是说,执行段内转移的CALL指令时,相当于先后执行以上两条指令。
      (2)段间转移的CALL指令等价于三条指令:
      push CS
      push eip
      jmp   目的位置
      RETN/RETF指令:
      按照前面讲CALL指令举的那个例子,CALL指令是进入子程序的指令,而例子中所说的跳出子程序这一过程也需要2条指令,它们是RETN/RETF。
      RETN/RETF是跳出子程序的指令,被称为返回指令。RETN指令用于从段内转移CALL进的子程序中返回;RETF指令用于从段间转移CALL进的子程序中返回。
      RETN/RETF在反汇编代码中呈现的形式如下:
      RETN
      RETN   操作数1
      RETF
      RETF   操作数1
      RETN等价于一条指令:POP   eip
      RETF等价于两条指令:
      POP   eip
      POP   CS
      而带有操作数的RETN/RETF指令则是在POP之后,执行ESP=ESP+操作数。

    2.  栈平衡:

    retn    14h

    retn和push平衡,retn 14表示有5个push进了5个参数,当然参数也可以通过寄存器传入(char*)。

    push 50
    lea eax,dword ptr ss:[esp+4]
    mov dword ptr ss:[esp+1C],ecx
    push eax
    lea ecx,dword ptr ss:[esp+1C]
    push ecx
    push StackFra.004020F4                   ; ASCII "%s%s%d"
    mov dword ptr ss:[esp+2C],edx
    mov dword ptr ss:[esp+10],706579
    call dword ptr ds:[<&MSVCR90.printf>]    ; MSVCR90.printf
    add esp,10 

    add esp,0x10和前面的4个push栈平衡。

  • 相关阅读:
    WinForm RadioButton 默认不选中
    使用Devexpress时,ArcEngine 加载地图空白。
    正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
    Vue使用iframe加载本地html,并进行通信,传递参数
    找不到 Microsoft.VisualStudio.Shell.Interop.IVsReferenceManager 服务的实例
    计算经纬度两点间距离
    The system clock has been set back more than 24 hours
    nmcli命令行修改网络连接名称
    linux安装mysql5.7
    <<<物品借记登记>>>
  • 原文地址:https://www.cnblogs.com/xunbu7/p/5531893.html
Copyright © 2011-2022 走看看