当前位置: 代码迷 >> 汇编语言 >> 这段代码是什么意思啊该如何处理
  详细解决方案

这段代码是什么意思啊该如何处理

热度:9796   发布时间:2013-02-26 00:00:00.0
这段代码是什么意思啊?
int main()
{
int i=0;
i++;
return 0;
}

以下是对应的汇编,,刚学汇编,看不懂

高手能帮忙解释一下吗??

Assembly code
5:    int main()6:    {00401030   push        ebp00401031   mov         ebp,esp00401033   sub         esp,44h00401036   push        ebx00401037   push        esi00401038   push        edi00401039   lea         edi,[ebp-44h]0040103C   mov         ecx,11h //ecx是计数器,把0001 0001放到其中做什么啊???00401041   mov         eax,0CCCCCCCCh  //这里也是???00401046   rep stos    dword ptr [edi]7:8:        int i=0;00401048   mov         dword ptr [ebp-4],0  //为什么是4???9:        i++;0040104F   mov         eax,dword ptr [ebp-4]00401052   add         eax,100401055   mov         dword ptr [ebp-4],eax10:11:       return 0;00401058   xor         eax,eax //xor是异或运算吧? 意思是eax让其为0,这是为什么啊???12:   }0040105A   pop         edi0040105B   pop         esi0040105C   pop         ebx0040105D   mov         esp,ebp0040105F   pop         ebp00401060   ret



其中先把ebp中的内容压倒栈中,
把esp栈的寄存器中的内容放到ebp中最后把ebp中的内容再mov到esp中。。。。。

这个我理解,防止esp被改变。。

为什么要 sub esp, 44H呢??

44H是一个0100 0100 的数字啊??

有什么用啊??


问题3:



------解决方案--------------------------------------------------------
太简单了。
Assembly code
5:    int main()6:    {00401030   push        ebp     ;保存旧值,以便出去时恢复00401031   mov         ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,                ;它只作基准,一旦进场,一般不变值)00401033   sub         esp,44h ;为局部变量留出空间(VC编译器对这个缓冲区通常留得都有富余)00401036   push        ebx ;保护可能被破坏的寄存器00401037   push        esi ;保护可能被破坏的寄存器00401038   push        edi ;保护可能被破坏的寄存器00401039   lea         edi,[ebp-44h] ;edi取局部变量空间的首地址0040103C   mov         ecx,11h       ;共要循环11次00401041   mov         eax,0CCCCCCCCh;就用它来清栈上留的空间(每个字节清为c,用cc是有讲究的)00401046   rep stos dword ptr [edi]  ;循环清7:8:        int i=0;00401048   mov         dword ptr [ebp-4],0    ;局部变量i 是个双字,初始值为09:        i++;0040104F   mov         eax,dword ptr [ebp-4]  ;将局部变量i赋给eax00401052   add         eax,1                  ;eax = eax+100401055   mov         dword ptr [ebp-4],eax  ;再回填i(i不就i++了吗)10:11:       return 0     ;C代码的这个返回值是通过eax传递的。00401058   xor         eax,eax ;eax=0(eax是返回值,是个重要的参数)12:   }0040105A   pop         edi     ;恢复保存的寄存器的旧值0040105B   pop         esi     ;(也就是还原到进来之前的状态)0040105C   pop         ebx     ;(同上)0040105D   mov         esp,ebp ;esp还原刚进门时的值0040105F   pop         ebp     ;还原进门时保存的ebp00401060   ret                 ;返回调用者(它要弹出压在栈上的EIP)
------解决方案--------------------------------------------------------
探讨
引用:
另外:eip没有看到push eip;
第二个问题:
call __chkesp (00420570)
一般我见到的call 一个符号,可是这条指令有些奇怪, 为什么有括号呢???

MASM汇编语言尚未发现可使用上述语句,请LZ注意区别C/C++编译器使用的方言与MASM语法的关系。
你的问题出在:大家都在用中文沟通,你突然冒一句西班牙……
  相关解决方案