2024年【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈),正式加入字节跳动

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

这里了解eax esp ebp 就可以啦
记不住也没关系,后面都会讲解

首先要了解 main()函数执行的时候也是被一个叫__tmainCRTStartup函数调用的

所以先给__tmainCRTStartup在栈区开辟空间
这是编译器底层的调用 暂时不做探讨 知道就可以

查看方法如下 在监视中添加esp、ebp查看地址请添加图片描述
esp、ebp是两个维护函数空间的指针
上面为低地址 ,下面为高地址
    栈顶指针 esp 0x008ff99c
    栈底指针 ebp 0x008ff9b8
    
    首先分配一块空间给__tmainCRTStartup
    
    栈区:
    |       |           低地址
    |       |
    |       |
    |       |
    |       |\ esp 0x008ff99c 	栈顶
    |       | \  
    |       |   __tmainCRTStartup
    |       | /
    |       |/ ebp 0x008ff9b8	栈底
    |       |           高地址

从以上代码可以看出 栈区 先使用高地址,再使用低地址
栈顶指针 esp 0x008ff99c(十六进制) —— 9,435,548 (十进制)
栈底指针 ebp 0x008ff9b8(十六进制) —— 9,435,576 (十进制)
8ff99c - 8ff9b8 计算得出 栈区为__tmainCRTStartup 开辟了28字节的空间


解读反汇编语句开始


一、为main函数开辟空间

1.002918B0 push ebp
按下F11进行逐语句操作,后面所有操作都是F11完成

push意为压栈 此行代码意为 将ebp压栈
黄色箭头指向第二条语句 说明第一条语句执行完了
此时的esp ebp 是维护__tmainCRTStartup函数的

代码展示

请添加图片描述

图解展示

    push 压栈 ebp 
        把ebp的地址压栈到栈顶 esp自动指向最上面的地址
        又因为栈先使用高地址 后使用低地址 
        所以esp 的地址减小4 esp = 0x008ff998
        
    |       |           低地址
    |       |
    |       |
    |  ebp  |   esp 0x008ff998
    |       |\  ↑↑↑向上移动 4字节     ~~0x008ff99c~~  
    |       | \  
    |       |   __tmainCRTStartup
    |       | /
    |       |/ ebp 0x008ff9b8
    |       |           高地址    

2. 002918B1 mov ebp,esp

mov可以理解为赋值,此代码意为:ebp = esp
此时是esp ebp向上移动的过程 要去维护main函数

请添加图片描述

    把esp的值赋给ebp
        此时ebp指向 esp指向的位置
        ebp = 0x008ff998
        
    |       |   
    |       |        
    |       |
    |       |        
    |       |           低地址
    |       |
    |       |
    |  ebp  |   ebp 0x008ff998   esp 0x008ff998
    |       |\  
    |       | \  
    |       |   __tmainCRTStartup
    |       | /
    |       |/ 
    |       |           高地址  

3. 002918B3 sub esp,0E4h

sub的意思是 减去
esp0E4h ,esp指针就指向了低地址
此操作将esp(栈顶指针) 向上移动,为main函数开辟空间并维护

请添加图片描述

    002918B3  sub         esp,0E4h  
    esp 减去 0E4h   0E4h == 228
        esp = 0x008ff8b4
      
                        低地址
    |       |\   esp 0x008ff8b4
    |       | \       
    |       |  \ 
    |       |   main     
    |       |  /         
    |       | /
    |       |/
    |  ebp  |   ebp 0x008ff998 
    |       |\  
    |       | \  
    |       |   __tmainCRTStartup
    |       | /
    |       |/ 
    |       |           高地址    

main函数的空间请添加图片描述

二、压栈

002918B9 push ebx
002918BA push esi
002918BB push edi

esp每次压栈后会自动指向最低地址处
EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
ESI/EDI分别叫做"源/目标索引寄存器"
暂时不理解没关系,直接看三

                           低地址
   |  edi      |   esp  0x008ff8a8
   |  esi      |    ↑   0x008ff8ac
   |  ebx      |    ↑   0x008ff8b0 
   | 			|\   ↑   0x008ff8b4
   | 			|  \   
   | 			|    \
   | 			|     main
   | 			|    /
   | 			|   /   
   | 			|  /         
   | 			| /
   |           |/
   |  ebp      |   ebp 0x008ff998 
   |           |\  
   |           | \  
   |           |   __tmainCRTStartup
   |           | /
   |           |/ 
   |           |           高地址 

请添加图片描述请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值