生活的天平本不平衡,只有通过努力改变其偏向。

VC中使用内联汇编

2008-07-25

这几天狂懒,什么事都不想做,什么地方也没去,一直在CSDN转转,居然看到03年刚学VC时在CSDN发的第一贴,那个菜呀,现在看来真的很好笑,那段时间真的太痛苦了,没人问没人学,就一个人闭门造车,后来开始混CSDN,一直到在水源混成星星了,后来就去的少了。还好走过来了,没有放弃。

今天回家折腾VC中内联汇编,感觉还是很方便的,我直接写的,基本没错误,编译就可以通过了,呵呵。下面是我想到几种调用类型:

1.使用C中的局部变量和全局变量。

1
2
3
4
5
6
7
8
9
10
	int a = 5,b=6,c;
	__asm
	{
		xor edx,edx	;edx=0
		add edx,a	;edx +=a
		add edx,b	;edx +=b
		add edx,g_nC;使用全局变量
		mov c,edx	;c=edx
	}
	printf("UseParameter : %d\n",c);

2.调用C中函数,stdcall方式和cdecl方式,pascal方式在控制台下没整出来,Delphi也不会就算了,和stdcall差不多,就是入栈方式不一样。

cdecl:从右到左入栈,由调用者清栈,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__cdecl int cdecl_sub(int a,int b)
{
return a-b;
}
 
void UseCdecl()
{
int nRet=0;
__asm
{
mov eax,6
mov ebx,5
push ebx
push eax
call cdecl_sub
add esp,8        ;调用者维护栈平衡
mov nRet,eax
}
printf("UseCdecl : %d\n",nRet);
}

stdcall:从右到左入栈,函数自己清栈。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
__stdcall int stdcall_sub(int a,int b)
{
	return a-b;
}
void UseStdCall()
{
	int nRet=0;
	__asm
	{
		mov eax,6
		mov ebx,5
		push ebx
		push eax
		call stdcall_sub
		mov nRet,eax
	}
	printf("UseStdCall : %d\n",nRet);
}

嘻嘻,就演示这么多,其他的调用方式也应该类似。

源码下载:

  C_And_ASM (4.3 KiB, 559 hits)

作者:lonkil | 分类目录:本站原创编程开发 | 标签:

4 条评论

  1. lonkil 说道:

    哈哈。

  2. biweilun 说道:

    不行啊,现在菜得很,MFC刚刚0起步。我们学校老师就知道教
    #include
    int main()
    {************************
    return 0;
    }
    ************

    其他屁都没有

  3. lonkil 说道:

    国内的大学教育体制和实际工作中运用差很多。不过学校里讲的算法也是很重的,这方面我差的一踏糊涂,当时在学校愤青呀,总是以为老师讲的没用,嘻嘻。
    我发现兄弟的学习目标很明确,接收能力也很强。MFC是我在学校的时候学的,Win32编程还是我工作了以后才学得。这一定和兄弟比差远了。消息是Windows编程的主要流程机制,再加上MFC的封装,搞的更神秘了,所以是比较难把握。不过开始学的时候知道一个应用程序的从开始到结束的消息流程就够了,不要研究太深。当然Windows编程开始学习的难度要比Script编程的门槛要高很多,毕竟有那么消息那么多API要掌握。等入门了以后,每一门编程都差不多了。

  4. biweilun 说道:

    VC我正在发奋修炼,大一老师好像什么都不教的,就讲那些无聊的算法,可是C又不是只用来计算的,晕死~~ 像学数学一样。我只好暑假开始自学Win32编程和MFC了,郁闷 系统的消息映射搞得火大