zoukankan      html  css  js  c++  java
  • call传参之通过堆栈

    常见的调用约定有:

    【例】按__stdcall约定调用函数test2(Par1, Par2) 
     
     
    push par2 ; 参数2
    push par1 ; 参数1
    call test2;
    {
    push ebp ; 保护现场原先的EBP指针,BP为基指(Base Pointer)寄存器,用它可直接存取堆栈中的数据,它的作用是在调用函数时保存ESP使函数结束时可以正确返回;加E(enhance)代表增强型寄存器,用于32位数据处理,类似AX与AL,AH的关系
    mov ebp, esp ; 设置新的EBP指针,指向栈顶
    mov eax, [ebp+0C] ; 调用参数2
    mov ebx, [ebp+08] ; 调用参数1
    sub esp, 8 ; 若函数要用局部变量,则要在堆栈中留出点空间

    add esp, 8 ; 释放局部变量占用的堆栈
    pop ebp ; 恢复现场的ebp指针
    ret 8 ; 返回(相当于ret; add esp,8)返回调用处,并弹出栈顶8个字节!参数没有用处了,但弹出是不必要的操作,可以直接修改堆栈的指针来清理,一个参数4字节,所以2*4=8,即平衡堆栈,因为两个参数是call附加的,本不需要


    }

  • 相关阅读:
    8/30 sql脚本
    navicat批量添加uuid去重
    循环向JsonArray添加对象
    java String字符串去除()里的内容
    工厂模式
    Thymeleaf学习
    SSH开发常用常见的src下建的包名
    04jQuery操作03
    04jQuery筛选jquery对象02
    04jQuery筛选jquery对象01
  • 原文地址:https://www.cnblogs.com/encode/p/2724926.html
Copyright © 2011-2022 走看看