

既有适合小白学习的零基础资料,也有适合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压栈
黄色箭头指向第二条语句 说明第一条语句执行完了
此时的espebp是维护__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
此时是espebp向上移动的过程 要去维护main函数
把esp的值赋给ebp
此时ebp指向 esp指向的位置
ebp = 0x008ff998
| |
| |
| |
| |
| | 低地址
| |
| |
| ebp | ebp 0x008ff998 esp 0x008ff998
| |\
| | \
| | __tmainCRTStartup
| | /
| |/
| | 高地址
3. 002918B3 sub esp,0E4h
sub的意思是 减去
esp减0E4h,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
| | /
| |/
| | 高地址








1232

被折叠的 条评论
为什么被折叠?



