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)
------解决方案--------------------------------------------------------