struct o{
int a;
int b;
};
int main() {
o o1,o2;
o2=o1;
         return 0;
}
运行时Alt+8看它的反汇编。发现赋值之前有4行很奇怪的代码,其中还调用了一个__RTC_UninitUse,不知道是什么意思。还请高手解释一下!struct o{
int a;
int b;
};
int main() {
00413530  push        ebp  
00413531  mov         ebp,esp 
00413533  sub         esp,0F8h 
00413539  push        ebx  
0041353A  push        esi  
0041353B  push        edi  
0041353C  lea         edi,[ebp-0F8h] 
00413542  mov         ecx,3Eh 
00413547  mov         eax,0CCCCCCCCh 
0041354C  rep stos    dword ptr es:[edi] 
0041354E  mov         byte ptr [ebp-0F1h],0 
o o1,o2;
o2=o1;
00413555  cmp         byte ptr [ebp-0F1h],0 //这个cmp是干什么用的?
0041355C  jne         main+3Bh (41356Bh)    //为什么?
0041355E  push        offset  (413617h)     //pushl了什么? 
00413563  call        @ILT+170(__RTC_UninitUse) (4110AFh) //这个函数是干什么用的?
00413568  add         esp,4 
0041356B  mov         eax,dword ptr [o1] 
0041356E  mov         dword ptr [o2],eax 
00413571  mov         ecx,dword ptr [ebp-8] 
00413574  mov         dword ptr [ebp-18h],ecx 

解决方案 »

  1.   

    楼主可以弄个简单的程序, 比如,
    int main()
    {
         return 0;
    }
    你再看它的汇编代码,然后对比你加了你自己的程序后的汇编代码有啥 不同,就知道多余的那些是干什么用的了。
      

  2.   

    cmp 应该是判断你的结构体是否分配了可用的空间。
    jne判断地址不为空就跳到相应的代码执行下去。
    push        offset  (413617h)莫非是返回地址?不是很清楚。
    call        @ILT+170(__RTC_UninitUse)  估计是个释放资源的函数。个人愚见,多指教
      

  3.   

    应该是cmp byte ptr [ebp-0F1h],0"导致"Z"位等于1,也就是cmp(campare)结果为零。
      

  4.   

    http://info.codepub.com/2008/07/info-20440.html