一 . 基本概念

  1. 函数是什么:
    一些指令的集合。

  2. 如何调用函数:
    用 call指令

  • 为什么:(对比jmp指令)
  • 参数与返回值:

举例:编写一个函数,得到任意两个整数的和

绿色框框:函数(整数相加),用EAX传递返回值
紫色框框:用ECX,EDX传递参数

二. 用堆栈的方式传递参数(实现堆栈平衡的两个方式)

  • 堆栈平衡是什么
    经过一系列变化后(参数、函数等的临时存储),堆栈里的栈顶指针依旧不变【ESP的值依旧不变】

1.(函数内平衡)保证ret这条指令前,ESP是压入函数的初始值

举例:

如果有10个参数怎么办?——没有那么多寄存器。

  • 向堆栈push1~5个数
  • 接着call指令

在(call指令对应的)特定地址依次:

  • ADD EAX,DWORD PTR DS:[ESP+4]
  • ADD EAX,DWORD PTR DS:[ESP+8]
  • …(共5个)
    RET(返回栈顶所知内存,即call指令下面的内存)

这里的+4+8…是因为现在栈顶是call指令下面的内存编号。

2.(函数外)在函数执行完毕后,要平衡参数导致的堆栈变化


上图中,push的1,2是临时参数,堆栈将它们调用完了,并没有释放,造成垃圾数值的堆积。

解决方式:

  • 外平栈
    在函数外,让ESP指向原来(push前)的位置
  • 内平栈
    在函数内:

ret 8

等价于上面的
add esp,8

逆向之汇编(堆栈平衡函数)相关推荐

  1. 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)

    title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...

  2. 从汇编角度理解 ebpesp 寄存器、函数调用过程、函数参数传递以及堆栈平衡

    关于函数参数的传递及堆栈指针的变化,一直缺乏系统的认识和了解,各种博客也只是片面的讲解某个局部知识点,并没有全局的把握和对栈的深刻理解.本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是 ...

  3. C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]

    如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...

  4. ebp 函数堆栈esp_函数参数压栈,栈帧ebp,esp怎样移动的?

    压栈一次esp-4,ebp不变 esp是栈顶指针寄存器,堆栈操作只和esp有关 比如有一个函数a,有两个参数,一般是这样的 PUSH 1 参数2压栈,esp-4 PUSH 2 参数1压栈,esp-4 ...

  5. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  6. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 .c代码文件 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const stat ...

  7. GDB调试汇编堆栈过程的学习

    GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...

  8. 【汇编语言与计算机系统结构笔记15】子程序设计:调用与返回,保护与恢复寄存器,子程序的参数传递,堆栈平衡,结构伪操作 STRUC

    本次笔记内容: 20.子程序设计-1-1 21.子程序设计-1-2 22.子程序设计-1-3 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的 ...

  9. 逆向之汇编(EBP寻址)

    1.寄存器传参和堆栈传参 (1)寄存器 (2)堆栈传参 ESP寻址 2.ESP寻址的缺点 (前提:用堆栈传参) 在堆栈中存些值,ESP(栈顶指针)就会发生变化,于是下面的esp寻址就要更新. 举例: ...

  10. 操作系统-ucore-lab1 Bootloader启动操作系统 A20 GDT全局描述符 使能和进入保护模式 ELF格式os 8259A中断控制器 8253定时器 函数调用堆栈跟踪函数

    操作系统-ucore-lab1 本文详细地址 实验一:系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm(修改了名字,以便于彩色显示)a. 开启 ...

最新文章

  1. 数据竞赛:记录3天进入比赛Top3%的全过程
  2. select into from 用法_年轻同事不讲武德,直接怼上MySQL常见SQL的七大错误用法
  3. php停车场计时收费软件,城市街道停车计时收费系统 路边停车收费软件
  4. 远程访问及控制(详解)——SSH远程管理及TCP Wrappers 访问控制
  5. Java学习笔记9-2——JavaWeb
  6. 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 1
  7. Windows安装python,以及python的集成开发环境Pycharm
  8. Java 错误:找不到或无法加载主类(源文件中含有包名 package)
  9. 视频分割修整功哪一款视频剪辑软件更好用?
  10. android vmware 分辨率,android 常见分辨率与DPI对照表
  11. html 实现页面加载进度,网页加载进度条实现方案
  12. 乌拉、利用python实现tree命令
  13. IIS 部署,发布 报错 500.19
  14. Bootstrap官网的Bootstrap 3 字体图标的使用测试
  15. MKS Robin nano V3.0主板使用RRF 固件教程
  16. python做的游戏怎么导到微信_微信跳一跳游戏的脚本-scratch导出到微信-微信小程序是怎么做的...
  17. 局域网找不到其它电脑
  18. ecs共享型s6怎么样?
  19. java 确认邮箱地址的可达性
  20. 小猪的猪栏文章类目导航

热门文章

  1. Geek卸载,Windows电脑再无卡顿
  2. ESD静电二极管封装规格,详细介绍
  3. 使用c语言实现数组连接
  4. C语言 输出螺旋数组
  5. windows下cmd批量复制文件
  6. MySQL的连接字符串 concat、concat_ws、group_concat、repeat()函数用法
  7. magicdraw 2022x
  8. java jni so_java 用jni调用so全过程
  9. 硬件设计基础--电路仿真EDA软件
  10. 河北省高中会考计算机试题及答案,河北省高中信息技术会考题.doc