码迷,mamicode.com
首页 > 其他好文 > 详细

堆栈图

时间:2020-01-16 00:58:49      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:ret   指针   缓冲   cal   word   根据   访问   contain   block   

CALL和JMP的区别

CALL会把调用处的下一个指令的地址压栈,而JMP不会

 

函数的调用过程

//funciton add(a,b){return a+b}
?
push第一个参数入栈
push第二个参数入栈
?
call调用的返回地址压栈
?
跳转准备
?
push ebp //保存当前栈底
?
mov ebp,esp //提升栈底,此时ebp所在的内存单元保存了原来的栈底地址
?
sub esp,40h //建立缓冲区
?
push ebx //保存当前执行环境
?
push esi //保存当前执行环境
?
push edi //保存当前执行环境
?
?
?
//填充缓冲区,cc 表示int3中断,当程序访问缓冲区的时候就会停下
?
lea edi,dword ptr ss:[ebp-40h] //区ebp-40的地址保存到edi
?
mov ecx,10h
?
mov eax,cccccccch
?
rep stos dword ptr es:[edi] //把eax的值循环复制到edi指向的内存地址,执行10h次,每次执行后根据flag寄存器的D位来进行+4/-4
?
?
?
//程序功能
mov eax,dword ptr ss:[ebp+8] //把函数调用的最后一个参数保存到eax
add eax,dword ptr ss:[ebp+c] //把第一个参数累加到eax
?
?
//恢复现场
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
?
retn //相当于pop eip
?
//此时栈里还有 第一个参数和第二个参数在栈顶,需要把它们干掉,以保证调用前和调用后的栈顶指针一致。
add esp,8 //外平栈
?
?
?

 

 

 

 

堆栈图

标签:ret   指针   缓冲   cal   word   根据   访问   contain   block   

原文地址:https://www.cnblogs.com/toolmanc/p/12199289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!