0day学习笔记(2)--函数调用

函数调用过程

  • 调用函数操作
    1. 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定
      • 一般为从右至左
      • mov 地址,参数 的一个操作并不直接pop而是定位到地址将参数传递进去
    2. call offset: 调用函数,call标识符或地址.同时为要调用的函数开辟新的栈帧
      • 向栈中压入当前指令的地址,即返回地址
      • 跳转到调用函数的入口地址
      • 返回的时候有类似retn的操作
    3. 调整栈顶和栈底
      • push ebp:将上一个函数栈底入栈,在上一个函数的栈顶
      • mov ebp,esp
      • sub esp ,10h:10h指的是新栈的大小
    4. 一系列新的函数的操作…
    5. 调用结束:
      • leave : 调整栈帧的指令
        • mov esp,ebp
        • pop ebp
      • retn:
        • POP EIP
        • jmp offset
  • 调用main函数时有and esp, 0FFFFFFF0h: 字节对齐(16位)的一个操作,编译优化需要
    在这里插入图片描述在这里插入图片描述
  • 返回地址
  • 将要调用函数的参数2
  • 将要调用函数的参数1
  • 当前函数的一系列变量,参数,地址
  • 以上即是调用完一个函数后属于上一个函数的栈空间的内容
posted @ 2020-02-08 17:55  10nnn4R  阅读(121)  评论(0编辑  收藏  举报