【语法】++前 和 后++ Another

来源:互联网 发布:网络代购 编辑:程序博客网 时间:2024/04/29 03:43

承接上文,为了区别开前置自增和后置自增的运算符重载的不同的声明方式,现在我们将进入重载函数内部看个究竟。

很不幸,首先CB对于STL提供的函数不能提供混合源代码的反汇编结果,所以我们直接看看吧。

这是<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator++()>函数的内部:

0x00428E7Cpush   ebp0x00428E7Dmov    ebp,esp0x00428E7Fsub    esp,0x40x00428E82mov    DWORD PTR [ebp-0x4],ecx0x00428E85mov    eax,DWORD PTR [ebp-0x4]0x00428E88mov    eax,DWORD PTR [eax]0x00428E8Alea    edx,[eax+0x4]0x00428E8Dmov    eax,DWORD PTR [ebp-0x4]0x00428E90mov    DWORD PTR [eax],edx0x00428E92mov    eax,DWORD PTR [ebp-0x4]0x00428E95leave0x00428E96ret

传入的i是ecx,然后对ecx取址得到迭代器对应的内存空间,之后其首地址对应的就是那个内部的真正访问数据的迭代器,对其自增。

ebp+0x4保存的是传入的i的地址,自增完毕之后进行保存。

最后回传自增后的i的地址。


这是<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator++(int)>函数的内部:

0x00428E48push   ebp0x00428E49mov    ebp,esp0x00428E4Bsub    esp,0x280x00428E4Emov    DWORD PTR [ebp-0x1c],ecx0x00428E51mov    eax,DWORD PTR [ebp-0x1c]0x00428E54mov    eax,DWORD PTR [eax]0x00428E56lea    ecx,[eax+0x4]0x00428E59mov    edx,DWORD PTR [ebp-0x1c]0x00428E5Cmov    DWORD PTR [edx],ecx0x00428E5Emov    DWORD PTR [ebp-0xc],eax0x00428E61lea    eax,[ebp-0x10]0x00428E64lea    edx,[ebp-0xc]0x00428E67mov    DWORD PTR [esp],edx0x00428E6Amov    ecx,eax0x00428E6Ccall   0x428e30 <__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(int* const&)>0x00428E71sub    esp,0x40x00428E74mov    eax,DWORD PTR [ebp-0x10]0x00428E77leave0x00428E78ret    0x4
我们注意到这个过程又调用了一个函数......我们也把跟进去看看吧......

0x00428E30push   ebp0x00428E31mov    ebp,esp0x00428E33sub    esp,0x40x00428E36mov    DWORD PTR [ebp-0x4],ecx0x00428E39mov    eax,DWORD PTR [ebp+0x8]0x00428E3Cmov    edx,DWORD PTR [eax]0x00428E3Emov    eax,DWORD PTR [ebp-0x4]0x00428E41mov    DWORD PTR [eax],edx0x00428E43leave0x00428E44ret    0x4
如上,我们获得了全部的流程。




0 0
原创粉丝点击