函数调试的反汇编分析
2016-09-08 14:34
183 查看
原文地址:http://blog.csdn.net/hudashi/article/details/7820338
下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
假设执行函数前堆栈指针ESP为NN
push p2 ;参数2入栈, ESP -= 4h , ESP = NN - 4h
push p1 ;参数1入栈, ESP -= 4h , ESP = NN - 8h
call test ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch
;//进入函数内
{
push ebp ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h
mov ebp, esp ;设置EBP指针指向栈顶 NN-10h
mov eax, dword ptr [ebp+0ch] ;ebp+0ch为NN-4h,即参数2的位置
mov ebx, dword ptr [ebp+08h] ;ebp+08h为NN-8h,即参数1的位置
sub esp, 8 ;局部变量所占空间ESP-=8, ESP = NN-18h
...
add esp, 8 ;释放局部变量, ESP+=8, ESP = NN-10h
pop ebp ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch
ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h, 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈.
}
看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,
从上面可以看出:__stdcall的调用方式是被调用者自己清理堆栈。如果为__cdecl方式调用。则为调用者清理堆栈。
下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
假设执行函数前堆栈指针ESP为NN
push p2 ;参数2入栈, ESP -= 4h , ESP = NN - 4h
push p1 ;参数1入栈, ESP -= 4h , ESP = NN - 8h
call test ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch
;//进入函数内
{
push ebp ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h
mov ebp, esp ;设置EBP指针指向栈顶 NN-10h
mov eax, dword ptr [ebp+0ch] ;ebp+0ch为NN-4h,即参数2的位置
mov ebx, dword ptr [ebp+08h] ;ebp+08h为NN-8h,即参数1的位置
sub esp, 8 ;局部变量所占空间ESP-=8, ESP = NN-18h
...
add esp, 8 ;释放局部变量, ESP+=8, ESP = NN-10h
pop ebp ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch
ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h, 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈.
}
看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,
从上面可以看出:__stdcall的调用方式是被调用者自己清理堆栈。如果为__cdecl方式调用。则为调用者清理堆栈。
相关文章推荐
- 一个关于函数内部指针参数返回的错误调试及分析
- C++反汇编代码分析--函数调用
- linux-0.11调试教程,fflush()函数实现分析和FILE类型定义
- Linux上coredump调试:call stack栈顶函数地址为0 分析实战
- C++反汇编代码分析--函数调用
- 反汇编深入分析函数调用
- shoelace源代码分析,bochs调试过程 -- loadbuilt()函数
- C++反汇编代码分析--函数调用
- c++反汇编代码分析--偷调函数
- C++反汇编代码分析--函数调用
- c++反汇编代码分析--偷调函数
- C 函数调用过程Ollydbg 反汇编分析 Demo int add(int,int)
- C 函数调用过程Ollydbg 反汇编分析 Demo int add(int,int)
- 反汇编深入分析函数调用
- 部分C库函数重写以及反汇编分析之memmov()
- 反汇编深入分析函数调用
- C++反汇编代码分析--函数调用
- 部分C库函数重写以及反汇编分析之memcpy()
- linux-0.11调试教程,终端的初始化init_terminal_io ()函数分析
- c++反汇编代码分析--偷调函数