欣欣celin 发表于 2014-5-4 23:24:58

用VC和DEBUG调试同一个程序,为何如此不同??

本帖最后由 欣欣celin 于 2014-5-6 21:36 编辑

原代码:
#include"stdio.h"
#include"stdlib.h"
void main(int argc, char *argv[])
{
       int i;

       printf("the number of string is: %d\n", argc-1);

       for(i=1; i<argc; i++)
      {
            printf("the string %d is: %s\n", i, argv);
      }
}
VC++6.0调试如下:
--- e:\c-spy\fish-cc\cc\main\main.c-------------------------------------------
1:    #include"stdio.h"
2:    #include"stdlib.h"
3:    void main(int argc, char *argv[])
4:    {
0040D710   push      ebp
0040D711   mov         ebp,esp
0040D713   sub         esp,44h
0040D716   push      ebx
0040D717   push      esi
0040D718   push      edi
0040D719   lea         edi,
0040D71C   mov         ecx,11h
0040D721   mov         eax,0CCCCCCCCh
0040D726   rep stos    dword ptr
5:      int i;
6:
7:      printf("the number of string is: %d\n", argc-1);
0040D728   mov         eax,dword ptr
0040D72B   sub         eax,1
0040D72E   push      eax
0040D72F   push      offset string "the number of string is: %d\n" (00422fbc)
0040D734   call      printf (00401080)
0040D739   add         esp,8
8:
9:      for(i=1; i<argc; i++)
0040D73C   mov         dword ptr ,1
0040D743   jmp         main+3Eh (0040d74e)
0040D745   mov         ecx,dword ptr
0040D748   add         ecx,1
0040D74B   mov         dword ptr ,ecx
0040D74E   mov         edx,dword ptr
0040D751   cmp         edx,dword ptr
0040D754   jge         main+63h (0040d773)
10:       {
11:         printf("the string %d is: %s\n", i, argv);
0040D756   mov         eax,dword ptr
0040D759   mov         ecx,dword ptr
0040D75C   mov         edx,dword ptr
0040D75F   push      edx
0040D760   mov         eax,dword ptr
0040D763   push      eax
0040D764   push      offset string "the string %d is: %s\n" (00422fa4)
0040D769   call      printf (00401080)
0040D76E   add         esp,0Ch
12:       }
0040D771   jmp         main+35h (0040d745)
13:   }
0040D773   pop         edi
0040D774   pop         esi
0040D775   pop         ebx
0040D776   add         esp,44h
0040D779   cmp         ebp,esp
0040D77B   call      __chkesp (00401100)
0040D780   mov         esp,ebp
0040D782   pop         ebp
0040D783   ret


DEBUG调试如下(图1~5):
(1)      (2)                                                                           
(3)      (4)

(5)



C,学到指针,越来越迷糊,于是开始学汇编,现用以上两种方式调试同一个程式,原来区别这么大,又看不懂了,求教各位大神来也{:7_148:}万分感激



青玄 发表于 2014-5-4 23:24:59

嗯...,我想应该是这样的吧!VC上面反汇编过来的话,是32位的汇编代码,而在虚拟DOS上面的是16位的汇编代码这两个肯定是有差别的32位的汇编它的寄存器是32位的。所以它的执行效率远比16位的要高,而且寻址能力是2^32,而16位的只有2^16,所以它的地址空间也不同,而且既然是寄存器的位宽也增大的许多,那么自然他们写出的代码是不同的,而且在32位的汇编中,已经没有段地址这个概念了,它直接可以通过偏移地址可以找到!

machimilk 发表于 2014-5-5 00:38:47

大概是16位和32位区别吧

sdhu 发表于 2014-5-5 01:10:06

不懂   坐等楼下大神

sidfate 发表于 2014-5-5 09:51:57

win32汇编和win16汇编是两个概念

向往青莲 发表于 2014-5-5 12:42:02

最好用Ollydbg调试。。。
当然用VC也不错。。。debug。。神马的都不用他。。
恩。。。相信我

oggplay 发表于 2014-5-6 16:59:35

系统加载一个程序不仅包含程序本身,还包括系统运行相关的附加信息。目测VC自带调试的只是main()函数部分,其他部分并没有显示而已。VC并不是反汇编。凑一下热闹(只是截取一下部分而已):


欣欣celin 发表于 2014-5-6 21:35:22

向往青莲 发表于 2014-5-5 12:42 static/image/common/back.gif
最好用Ollydbg调试。。。
当然用VC也不错。。。debug。。神马的都不用他。。
恩。。。相信我

那样的话,偶以后还得学学OD才能把以上看懂,好遥远哦

向往青莲 发表于 2014-5-6 21:41:14

欣欣celin 发表于 2014-5-6 21:35 static/image/common/back.gif
那样的话,偶以后还得学学OD才能把以上看懂,好遥远哦

←_←。。。
页: [1]
查看完整版本: 用VC和DEBUG调试同一个程序,为何如此不同??