首页
社区
课程
招聘
[旧帖] [求助]置顶版块中的一道测试题 0.00雪花
发表于: 2009-8-4 09:40 3210

[旧帖] [求助]置顶版块中的一道测试题 0.00雪花

2009-8-4 09:40
3210
http://bbs.pediy.com/showthread.php?t=51839

在以上链接中有一道c语言的测试题:

1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
  int t;
  scanf("%d",&t);
  在这里加入代码
}
void main()
{
  int m;
  test();
  printf("m=%d",m);
}

/*----------------------------------------------------------------*/
以下是我写的代码(vs2008-vc9.0,debug)

#include <stdio.h>

void test()
{
        int t;
        scanf("%d",&t);
        _asm
        {
                add esp,0x1C0
                push t
                sub esp,0x1BC
        }
}

void main()
{
        int m ;
        test();
        printf("m = %d",m);
}

/*----------------------------------------------------------------*/
以下是反汇编后的代码

void main()
{
00430760  push        ebp  
00430761  mov         ebp,esp
00430763  sub         esp,0D8h
00430769  push        ebx  
0043076A  push        esi  
0043076B  push        edi  
0043076C  lea         edi,[ebp-0D8h]
00430772  mov         ecx,36h
00430777  mov         eax,0CCCCCCCCh
0043077C  rep stos    dword ptr es:[edi]
0043077E  mov         byte ptr [ebp-0D1h],0
        int m ;
        test();
00430785  call        test (42E56Eh)
        printf("m = %d",m);
0043078A  cmp         byte ptr [ebp-0D1h],0
00430791  jne         main+40h (4307A0h)
00430793  push        offset  (4307C7h)
00430798  call        @ILT+1950(__RTC_UninitUse) (42E7A3h)
0043079D  add         esp,4
004307A0  mov         eax,dword ptr [m]
004307A3  push        eax  
004307A4  push        offset string "m = %d" (48BC70h)
004307A9  call        @ILT+4440(_printf) (42F15Dh)
004307AE  add         esp,8
}

void test()
{
004306C0  push        ebp  
004306C1  mov         ebp,esp
004306C3  sub         esp,0CCh
004306C9  push        ebx  
004306CA  push        esi  
004306CB  push        edi  
004306CC  lea         edi,[ebp-0CCh]
004306D2  mov         ecx,33h
004306D7  mov         eax,0CCCCCCCCh
004306DC  rep stos    dword ptr es:[edi]
        int t;
        scanf("%d",&t);
004306DE  lea         eax,[t]
004306E1  push        eax  
004306E2  push        offset string "%d" (48BC6Ch)
004306E7  call        @ILT+3300(_scanf) (42ECE9h)
004306EC  add         esp,8
        _asm
        {
                add esp,0x1C0
004306EF  add         esp,1C0h
                push t
004306F5  push        dword ptr [t]
                sub esp,0x1BC
004306F8  sub         esp,1BCh
        }
}

/*---------------------------------------------------------------------------*/

在这里我有两个疑问想请教各位大牛:(vs2008 DeBug)

1.函数入口处sub  esp,0CCh和 sub    esp,0D8h 指令中的CC和D8和怎么计算出来的,保留这空间是做什么用途的?

2.我添加完代码之后可以把m的值置成我输入的值了,但怎么样才能消除“使用未初始化变量”的错误?

谢谢各位!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请高手路过的时候,进来解答下;
2009-8-4 11:55
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
用release版本看看
2009-8-4 15:47
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
那三道题中只有一道能算c语言的测试题,但不是你说的这道
2009-8-4 15:52
0
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
void test()
{
        int t;
        scanf("%d",&t);

}

void main()
{
        int m ;
        test();
        printf("m = %d",m);
}

release版本反汇编:

void test()
{
        int t;
        scanf("%d",&t);

}

void main()
{
00401000  push        ecx  
        int m ;
        test();
00401001  lea         eax,[esp]
00401004  push        eax  
00401005  push        offset string "%d" (4020F4h)
0040100A  call        dword ptr [__imp__scanf (4020A4h)]
        printf("m = %d",m);
00401010  mov         ecx,dword ptr [esp+8]
00401014  push        ecx  
00401015  push        offset string "m = %d" (4020F8h)
0040101A  call        dword ptr [__imp__printf (40209Ch)]
}

执行结果:
输入2 ;
输出m=2;
没加代码的情况(去掉之前添加的汇编部分),感觉m和t是同个地址;

希望各位大牛能再解释下;
2009-8-4 16:21
0
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是不是c语言范畴倒不要紧,我希望能了解其中原理;可以的话麻烦讲解下,谢谢!
2009-8-4 16:26
0
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
强烈要求,高手路过这里
2009-8-5 13:26
0
游客
登录 | 注册 方可回帖
返回
//