首页
社区
课程
招聘
关于vs2010程序的调试问题
发表于: 2011-4-15 20:49 5319

关于vs2010程序的调试问题

2011-4-15 20:49
5319
#include "stdafx.h"

inline int max(int i,int j);

int main()
{
	int a,b,c;
	a=4;
	b=5;
	c=0;
    
	c=max(a,b);

	printf("%d",c);

	getchar();
	
	return 0;
}

 inline int max(int i,int j)
{
	if (i>j) j=i;
	
  return j;
}


今天想跟踪下 inline函数到底是怎样提高运行速度的。
不过很郁闷的是,跟踪不到max函数的处理过程。
可能是我太菜了,不过我不理解的是od里的这段代码

00401000  /$  6A 05         push 5                                   ; /<%d> = 5
00401002  |.  68 F4204000   push inlinefu.004020F4                   ; |format = "%d"
00401007  |.  FF15 A4204000 call dword ptr ds:[<&MSVCR100.printf>]   ; \printf
0040100D  |.  83C4 08       add esp,8
00401010  |.  FF15 9C204000 call dword ptr ds:[<&MSVCR100.getchar>]  ; [getchar
00401016  |.  33C0          xor eax,eax
00401018  \.  C3            retn



为嘛直接push5呀。我一直想跟踪到
push 4
push 5
call max  这样类似的。
寄存器跟内存我一直盯着,堆栈也盯着,愣是没发现4 5出现,怎么回事呀。

小菜初学破解,如果闹什么笑话请见谅哈。

我要问的是他的直接push 5 是怎么来的 根本没经过max函数的运算

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
c是a,b的最大值,编译时知道是5.
  printf("%d",c);
优化后直接输出5了。
2011-4-15 20:52
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
啊 编译器这么智能呀。
连函数干了什么也知道。

怎么让他不优化呀,我想看看 加inline跟不加inline是怎么处理的。
2011-4-15 20:59
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用VS2008编译的居然和VS2010的不一样?
========================================================
004113DE    C745 F8 0400000>MOV DWORD PTR SS:[EBP-8],4
004113E5    C745 EC 0500000>MOV DWORD PTR SS:[EBP-14],5
004113EC    C745 E0 0000000>MOV DWORD PTR SS:[EBP-20],0
004113F3    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
004113F6    50              PUSH EAX  ; push 5
004113F7    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
004113FA    51              PUSH ECX  ; push 4
004113FB    E8 18FDFFFF     CALL test_inl.00411118   ;max函数
00411400    83C4 08         ADD ESP,8
00411403    8945 E0         MOV DWORD PTR SS:[EBP-20],EAX
00411406    8BF4            MOV ESI,ESP
00411408    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
0041140B    50              PUSH EAX
0041140C    68 3C574100     PUSH test_inl.0041573C                   ; ASCII "%d"
00411411    FF15 BC824100   CALL DWORD PTR DS:[<&MSVCR90D.printf>]   ; MSVCR90D.printf
00411417    83C4 08         ADD ESP,8
0041141A    3BF4            CMP ESI,ESP
0041141C    E8 29FDFFFF     CALL test_inl.0041114A
00411421    8BF4            MOV ESI,ESP
00411423    FF15 C4824100   CALL DWORD PTR DS:[<&MSVCR90D.getchar>]  ;
========================================================
2011-4-16 10:44
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
 内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。

刚才又查了下:在程序中,调用内联函数时,该函数在编译时被替代,而不是像一般函数那样是在运行时被调用。所以没有出现那种
push 5
push 4
call max
那个push 5,应该是printf()函数中对C压栈。
2011-4-16 11:09
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=李小龙lxl;948485]用VS2008编译的居然和VS2010的不一样?
========================================================
004113DE    C745 F8 0400000>MOV DWORD PTR SS:[EBP-8],4
004113E5    C...[/QUOTE]
2010果然比较厉害呀。
可能效率高了些。

5# kongfei
那个我设不设置内联,好像都没什么关系。
vs2010 都没有调用函数call,直接将结果push出来了。

看4l那个od源码才确定
2011-4-16 12:56
0
游客
登录 | 注册 方可回帖
返回
//