+ -
当前位置:首页 → 问答吧 → 这段代码是什么意思啊?

这段代码是什么意思啊?

时间:2011-11-18

来源:互联网

int main()
{
int i=0;
i++;
return 0;
}

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

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

Assembly code



5:    int main()
6:    {
00401030   push        ebp
00401031   mov         ebp,esp
00401033   sub         esp,44h
00401036   push        ebx
00401037   push        esi
00401038   push        edi
00401039   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,1
00401055   mov         dword ptr [ebp-4],eax
10:
11:       return 0;
00401058   xor         eax,eax //xor是异或运算吧? 意思是eax让其为0,这是为什么啊???
12:   }
0040105A   pop         edi
0040105B   pop         esi
0040105C   pop         ebx
0040105D   mov         esp,ebp
0040105F   pop         ebp
00401060   ret








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

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

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

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

有什么用啊??


问题3:

作者: chouxiaoya1112   发布时间: 2011-11-18

太简单了。
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 是个双字,初始值为0
9:        i++;
0040104F   mov         eax,dword ptr [ebp-4]  ;将局部变量i赋给eax
00401052   add         eax,1                  ;eax = eax+1
00401055   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     ;还原进门时保存的ebp
00401060   ret                 ;返回调用者(它要弹出压在栈上的EIP)

作者: gsy999   发布时间: 2011-11-18



最后那个ret 是回到 CRTMain吧??


引用 1 楼 gsy999 的回复:
太简单了。

Assembly code


5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
                ;它只作基准,一旦进场,一般不变值)
004……

作者: qunqun2012   发布时间: 2011-11-18

另外:eip没有看到push eip;

貌似是:CRTMain调用main的时候push 了eip,不知道这么理解对不对?

不对 ,请指出,谢谢


第二个问题:
call __chkesp (00420570)

一般我见到的call 一个符号,可是这条指令有些奇怪, 为什么有括号呢???




引用 2 楼 qunqun2012 的回复:
最后那个ret 是回到 CRTMain吧??



引用 1 楼 gsy999 的回复:
太简单了。

Assembly code


5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
                ;它……

作者: qunqun2012   发布时间: 2011-11-19