首页
社区
课程
招聘
cdtDraw 返回值在eax中还是在ecx中
发表于: 2006-4-2 18:11 5553

cdtDraw 返回值在eax中还是在ecx中

2006-4-2 18:11
5553
今天看这样一段代码,是关于用cards.dll写扑克游戏的.有如下的一行 invoke 调用,在调用前将ecx入栈,稍后出栈,但一般的函数返回值都应在 eax 中啊,如果去掉 push ecx 和 pop ecx 这两行语句,程序会出错,这到底是怎么回事?
......
push        ecx
invoke        cdtDraw, hDC, esi, edi, ebx, mdFace, rgbBground
pop        ecx
......

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
这是因为ecx中保存着有其它地方要用的数据,而cdtDraw会改变ecx的值,所以在调用cdtDraw函数的时候要先保存一下ecx的值,函数返回后再恢复ecx的值。
2006-4-2 18:17
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢小虾的帮助, ECX 中确有要保护的数据, 但并没有 cdtDraw 函数破坏 ECX 寄存器的证据.照理说,函数要破坏某些寄存器前,应先将其保护起来,在返回前
再恢复它们,难道 cdtDraw 函数不知道这样做吗?
2006-4-2 18:32
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
API函数一般只会保存edi、esi和ebx、ebp、esp这几个寄存器,EAX/ECX/EDX这三个寄存器可不能保证了。
2006-4-2 18:40
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还请小虾不厌其烦,API函数返回值在EAX中自不必说,那么在实际应用中,像edi、esi和ebx、ebp、esp这几个寄存器是不是可以不用去管它,而EAX/ECX/EDX中如果有需要保护的数据,必须先PUSH起来,对吗?还有其它寄存器需要PUSH吗?
2006-4-2 18:54
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
eax/ecx/edx如果有需要保护的数据,必须先push起来,其它基本上不用了。
2006-4-2 19:07
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
thank you very much
2006-4-2 19:08
0
游客
登录 | 注册 方可回帖
返回
//