老码识途 汇编分析函数调用和局部变量

1.在vc或vs下,编译时可调出各种视图窗口:反汇编,寄存器,内存(可修改值)等等。。。
2.windows下采用小端方式存储数据,数据的地存放在地址的低位(数据12345678放在【78 56 34 12】中(地址前面是低位))
3.esp是栈指针,push一次减4,EIP指向要执行的代码;对于call指令 (相当于push 返回地址 jmp 函数入口)call先到存放函数入口地址处,在执行jmp到函数处;函数参数从右往左压栈,再入栈返回地址,在入栈ebp(ebp在函数中用来指向参数的地址);使用ret返回并pop
4. return c; 8B 45 FC mov eax,dword ptr [ebp-4]//将返回值存放在eax中
程序分析:

10: int main()
11: {//到12处是主函数的处理
004011E0 55 push ebp     
004011E1 8B EC mov ebp,esp
004011E3 83 EC 44 sub esp,44h
004011E6 53 push ebx
004011E7 56 push esi
004011E8 57 push edi
004011E9 8D 7D BC lea edi,[ebp-44h]
004011EC B9 11 00 00 00 mov ecx,11h
004011F1 B8 CC CC CC CC mov eax,0CCCCCCCCh
004011F6 F3 AB rep stos dword ptr [edi]
12: int a;//无汇编代码,在栈中存放了一个局部变量,未初始化(a=0xCC CC CC CC)
13: a=add(1,2,3);
004011F8 6A 03 push 3//参数入栈,esp-4
004011FA 6A 02 push 2//esp-4
004011FC 6A 01 push 1//esp-4
004011FE E8 8E FE FF FF call @ILT+140(add) (00401091)//转到add函数入口地址
00401203 83 C4 0C add esp,0Ch//到参数入栈前位置(相当于弹出3个参数)
00401206 89 45 FC mov dword ptr [ebp-4],eax
14: } 
00401091 E9 DA 00 00 00 jmp add (00401170) //跳到add函数入口处
 int add(int a,int b,int d)
4: {
00401170 55 push ebp        //用来指示存在栈中的数(用其取出局部变量的位置)
00401171 8B EC mov ebp,esp //得到栈顶地址
00401173 83 EC 48 sub esp,48h //
00401176 53 push ebx //保存寄存器值
00401177 56 push esi
00401178 57 push edi
00401179 8D 7D B8 lea edi,[ebp-48h] //
0040117C B9 12 00 00 00 mov ecx,12h
00401181 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401186 F3 AB rep stos dword ptr [edi]
5: int c= a+b;
00401188 8B 45 08 mov eax,dword ptr [ebp+8] //ebp+8/12 得到栈中存放参数地址
0040118B 03 45 0C add eax,dword ptr [ebp+0Ch] //结果放入eax寄存器中
0040118E 89 45 FC mov dword ptr [ebp-4],eax //保存值(相当于入栈)
6: int f;
7: cout<<" "<<endl;
00401191 68 28 10 40 00 push offset @ILT+35(std::endl) (00401028)
00401196 68 1C F0 42 00 push offset string " " (0042f01c)
0040119B 68 A0 3E 43 00 push offset std::cout (00433ea0)
004011A0 E8 00 FF FF FF call @ILT+160(std::operator<<) (004010a5)
004011A5 83 C4 08 add esp,8
004011A8 8B C8 mov ecx,eax
004011AA E8 C4 FE FF FF call @ILT+110(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401073)
8: return c;
004011AF 8B 45 FC mov eax,dword ptr [ebp-4] //存放返回值到eax中
9: }
004011B2 5F pop edi
004011B3 5E pop esi
004011B4 5B pop ebx
004011B5 83 C4 48 add esp,48h
004011B8 3B EC cmp ebp,esp
004011BA E8 A1 7E 00 00 call __chkesp (00409060)
004011BF 8B E5 mov esp,ebp
004011C1 5D pop ebp
004011C2 C3 ret //返回地址装入esp,回到主程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值