这个程序的源代码为调用一个加法函数,打印main用来定位主函数入口,目的是分析一个函数在调用的过程中汇编中的代码是怎么样的
打开反汇编,寻找到主函数;
call 调用一个函数的过程是:push eip 先保存当前的eip指令指针,然后jum到函数的地址
下面这里是按F7进入到函数里面
一个函数的调用过程:
00CBD300 /> \55 PUSH EBP ; 保存栈底指针 00CBD301 |. 8BEC MOV EBP,ESP ; 把栈顶指针给栈底,栈顶和栈底指向同一地址 00CBD303 |. 81EC C0000000 SUB ESP,0C0 ; 抬高栈顶0c0长度,开辟一个新的栈长度 00CBD309 |. 53 PUSH EBX ; 下面三个寄存器可能会用到覆盖原来的值,先保存起来,等下怕这个函数改成什么鬼了都不知道,避免破坏原理的main函数 00CBD30A |. 56 PUSH ESI 00CBD30B |. 57 PUSH EDI 00CBD30C |. 8DBD 40FFFFFF LEA EDI,DWORD PTR SS:[EBP-C0] ; 新的栈顶的首地址给了edi 00CBD312 |. B9 30000000 MOV ECX,30 ; ecx经常用来循环,循环计数器初始化 00CBD317 |. B8 CCCCCCCC MOV EAX,CCCCCCCC 00CBD31C |. F3:AB REP STOS DWORD PTR ES:[EDI] ; rep 重复执行上面一条 把新的栈空间全部刷成cccc,初始化 00CBD31E |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 传进来的参数 00CBD321 |. 0345 0C ADD EAX,DWORD PTR SS:[EBP+C] ; 实现加法功能 00CBD324 |. 5F POP EDI ; 复原原来的值 00CBD325 |. 5E POP ESI 00CBD326 |. 5B POP EBX 00CBD327 |. 8BE5 MOV ESP,EBP ; 复原原来的栈顶 00CBD329 |. 5D POP EBP ; 复原栈底 00CBD32A \. C3 RETN ; eax 默认返回函数