解析汇编与C的调用(2)无参数有返回值的情况


int _tmain(int argc, _TCHAR* argv[])
{
00251400 55                   push        ebp  
00251401 8B EC                mov         ebp,esp  
00251403 81 EC C0 00 00 00    sub         esp,0C0h  
00251409 53                   push        ebx  
0025140A 56                   push        esi  
0025140B 57                   push        edi  
0025140C 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  
00251412 B9 30 00 00 00       mov         ecx,30h  
00251417 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
0025141C F3 AB                rep stos    dword ptr es:[edi]  
    add();
0025141E E8 B8 FD FF FF       call        add (02511DBh)  
    return 0;
00251423 33 C0                xor         eax,eax  
}
00251425 5F                   pop         edi  
00251426 5E                   pop         esi  
00251427 5B                   pop         ebx  
00251428 81 C4 C0 00 00 00    add         esp,0C0h  
0025142E 3B EC                cmp         ebp,esp  
00251430 E8 10 FD FF FF       call        __RTC_CheckEsp (0251145h)  
00251435 8B E5                mov         esp,ebp  
00251437 5D                   pop         ebp  
00251438 C3                   ret  

===========================================

int add(){
002513C0 55                   push        ebp  
002513C1 8B EC                mov         ebp,esp  
002513C3 81 EC CC 00 00 00    sub         esp,0CCh  

---------------------------------------------------------------------->        开辟栈帧
002513C9 53                   push        ebx  
002513CA 56                   push        esi  
002513CB 57                   push        edi  

---------------------------------------------------------------------->        保存现场
002513CC 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  
002513D2 B9 33 00 00 00       mov         ecx,33h  
002513D7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
002513DC F3 AB                rep stos    dword ptr es:[edi]  

---------------------------------------------------------------------->        初始化栈空间
    int a = 3;
002513DE C7 45 F8 03 00 00 00 mov         dword ptr [a],3  
    return a;
002513E5 8B 45 F8             mov         eax,dword ptr [a]  

---------------------------------------------------------------------->        返回结果值
}
002513E8 5F                   pop         edi  
002513E9 5E                   pop         esi  
002513EA 5B                   pop         ebx  

---------------------------------------------------------------------->        恢复现场
002513EB 8B E5                mov         esp,ebp  
002513ED 5D                   pop         ebp  

---------------------------------------------------------------------->        恢复栈帧
002513EE C3                   ret  

---------------------------------------------------------------------->        call对应的返回

ret = jmp + pop

汇编地址/有效地址栈的内存基础寄存器栈上运行的函数
ediesp
esiesp
ebxesp
cesp
c
c
3ebp+8
c
ebpesp/ebpadd()
return addressesp
esp
ebpmain()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值