|
30鱼币
本帖最后由 欣欣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[i]);
}
}
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,[ebp-44h]
0040D71C mov ecx,11h
0040D721 mov eax,0CCCCCCCCh
0040D726 rep stos dword ptr [edi]
5: int i;
6:
7: printf("the number of string is: %d\n", argc-1);
0040D728 mov eax,dword ptr [ebp+8]
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 [ebp-4],1
0040D743 jmp main+3Eh (0040d74e)
0040D745 mov ecx,dword ptr [ebp-4]
0040D748 add ecx,1
0040D74B mov dword ptr [ebp-4],ecx
0040D74E mov edx,dword ptr [ebp-4]
0040D751 cmp edx,dword ptr [ebp+8]
0040D754 jge main+63h (0040d773)
10: {
11: printf("the string %d is: %s\n", i, argv);
0040D756 mov eax,dword ptr [ebp-4]
0040D759 mov ecx,dword ptr [ebp+0Ch]
0040D75C mov edx,dword ptr [ecx+eax*4]
0040D75F push edx
0040D760 mov eax,dword ptr [ebp-4]
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位的汇编中,已经没有段地址这个概念了,它直接可以通过偏移地址可以找到!
|