免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 紫牧
打印 上一主题 下一主题

[函数] 一个面试题,说是考函数调用方式 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-09-08 13:13 |只看该作者
你最好再问问明白人,我汇编比较差,不保证一定正确

论坛徽章:
0
12 [报告]
发表于 2007-09-08 13:42 |只看该作者

论坛徽章:
0
13 [报告]
发表于 2007-09-08 13:55 |只看该作者
似乎不行啊
1:    #include <stdio.h>
2:
3:    void test()
4:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,44h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-44h]
0040102C   mov         ecx,11h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:        int t;
6:
7:        scanf("%d", &t);
00401038   lea         eax,[ebp-4]
0040103B   push        eax
0040103C   push        offset string "%d" (0042201c)
00401041   call        scanf (004010d0)
00401046   add         esp,8
8:        (&t)[3] = t;
00401049   mov         ecx,dword ptr [ebp-4]
0040104C   mov         dword ptr [ebp+8],ecx
9:    }
0040104F   pop         edi
00401050   pop         esi
00401051   pop         ebx
00401052   add         esp,44h
00401055   cmp         ebp,esp
00401057   call        __chkesp (00401130)
0040105C   mov         esp,ebp
0040105E   pop         ebp
0040105F   ret

11:   int main()
12:   {
00401080   push        ebp
00401081   mov         ebp,esp
00401083   sub         esp,44h
00401086   push        ebx
00401087   push        esi
00401088   push        edi
00401089   lea         edi,[ebp-44h]
0040108C   mov         ecx,11h
00401091   mov         eax,0CCCCCCCCh
00401096   rep stos    dword ptr [edi]
13:       int m;
14:
15:       test();
00401098   call        @ILT+10(test) (0040100f)
16:       printf("%d\n", m);
0040109D   mov         eax,dword ptr [ebp-4]
004010A0   push        eax
004010A1   push        offset string "m=%d\n" (00422020)
004010A6   call        printf (00401170)
004010AB   add         esp,8
17:   }
004010AE   pop         edi
004010AF   pop         esi
004010B0   pop         ebx
004010B1   add         esp,44h
004010B4   cmp         ebp,esp
004010B6   call        __chkesp (00401130)
004010BB   mov         esp,ebp
004010BD   pop         ebp
004010BE   ret

这是VC上的汇编代码

[ 本帖最后由 紫牧 于 2007-9-8 14:00 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-09-08 14:01 |只看该作者
这块我看的vc8生成的的汇编,在push ebp之后也push了个ecx(这点我也很疑惑,但是确实是local第一个local变量在push ebp之上)

论坛徽章:
0
15 [报告]
发表于 2007-09-08 14:11 |只看该作者
我这个是VC6里面的汇编,它里面有个
mov         ebp,esp
sub          esp,44h
这样子m和t相距就比较远了啊

论坛徽章:
0
16 [报告]
发表于 2007-09-08 14:20 |只看该作者
确实是,等我再研究研究,对了,你在vc6上的执行结果正确么?

论坛徽章:
0
17 [报告]
发表于 2007-09-08 14:27 |只看该作者
void test()
{
00401020  push        ebp  
00401021  mov         ebp,esp
00401023  sub         esp,8
    int t = 10;
00401026  mov         dword ptr [t],0Ah
        int t2 = 10;
0040102D  mov         dword ptr [t2],0Ah
        printf("%d  %d\n", &t, &t2);
00401034  lea         eax,[t2]
00401037  push        eax  
00401038  lea         ecx,[t]
0040103B  push        ecx  
0040103C  push        offset ___xi_z+3Ch (402154h)
00401041  call        dword ptr [__imp__printf (4020ECh)]
00401047  add         esp,0Ch
       
        (&t)[3] = t;
0040104A  mov         edx,dword ptr [t]
0040104D  mov         dword ptr [ebp+4],edx
}

论坛徽章:
0
18 [报告]
发表于 2007-09-08 14:30 |只看该作者
这个是我在vc8上生成的汇编,实际上push ebp后,我定义两个变量的话确实是再push ebp后在stack上分配了8字节,如果只定义一个int变量的话,就生成个莫名其妙的push ecx指令(其实这个push ecx就是给 int t这个单独的一个local变量分配的空间),所以我那个(&t)[3]是正确的,不知道在vc6上会如何了,我没有vc6

论坛徽章:
0
19 [报告]
发表于 2007-09-08 15:42 |只看该作者
堆栈溢出技术~~

论坛徽章:
0
20 [报告]
发表于 2007-09-08 16:42 |只看该作者
楼上俺测试了你的方法,不行的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP