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] //把函数调用的最后一个参数保存到eaxadd eax,dword ptr ss:[ebp+c] //把第一个参数累加到eax??//恢复现场pop edipop esipop ebxmov esp,ebppop ebp?retn //相当于pop eip?//此时栈里还有 第一个参数和第二个参数在栈顶,需要把它们干掉,以保证调用前和调用后的栈顶指针一致。add esp,8 //外平栈???
原文地址:https://www.cnblogs.com/toolmanc/p/12199289.html
时间: 2024-11-08 21:17:32