用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:}万分感激
嗯...,我想应该是这样的吧!VC上面反汇编过来的话,是32位的汇编代码,而在虚拟DOS上面的是16位的汇编代码这两个肯定是有差别的32位的汇编它的寄存器是32位的。所以它的执行效率远比16位的要高,而且寻址能力是2^32,而16位的只有2^16,所以它的地址空间也不同,而且既然是寄存器的位宽也增大的许多,那么自然他们写出的代码是不同的,而且在32位的汇编中,已经没有段地址这个概念了,它直接可以通过偏移地址可以找到! 大概是16位和32位区别吧 不懂 坐等楼下大神 win32汇编和win16汇编是两个概念 最好用Ollydbg调试。。。
当然用VC也不错。。。debug。。神马的都不用他。。
恩。。。相信我 系统加载一个程序不仅包含程序本身,还包括系统运行相关的附加信息。目测VC自带调试的只是main()函数部分,其他部分并没有显示而已。VC并不是反汇编。凑一下热闹(只是截取一下部分而已):
向往青莲 发表于 2014-5-5 12:42 static/image/common/back.gif
最好用Ollydbg调试。。。
当然用VC也不错。。。debug。。神马的都不用他。。
恩。。。相信我
那样的话,偶以后还得学学OD才能把以上看懂,好遥远哦 欣欣celin 发表于 2014-5-6 21:35 static/image/common/back.gif
那样的话,偶以后还得学学OD才能把以上看懂,好遥远哦
←_←。。。
页:
[1]