- 浏览: 228779 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
昨天还在感叹自己面对Windows开发就像一个傻瓜,今天随便找了个突破口,期待能够将自己掌握的知识联系起来,结果就是一发不可收拾,越看越迷糊,越想越凌乱。不管怎么样,先将今天看到的新面孔记个流水帐吧。
首先,突破口就是WinMain函数的修饰符WINAPI。从WINDEF.H这个头文件中,我得知WINAPI实质上就是__stdcall。那么什么是__stdcall呢?
__stdcall属于Microsoft定义的函数修饰符,除了她之外,还有__fastcall、__cdecl和thiscall定义了函数被调用的方式,其中,thiscall不是关键字。以前关注的都是函数如何去定义,而函数调用都是很平常的事情,从来都没有去思考在函数调用的过程中,发生了什么事情。以下文字摘自MSDN,对于函数调用的过程中发生的事情做了描述:
All arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register, except for 8-byte structures, which are returned in the EDX:EAX register pair. Larger structures are returned in the EAX register as pointers to hidden return structures. Parameters are pushed onto the stack from right to left.
The compiler generates prolog and epilog code to save and restore the ESI, EDI, EBX, and EBP registers, if they are used in the function.
译文:所有的实参在传递的时候都会被扩展为32位,返回值也是如此,并且会存储至EAX寄存器中(天啊,寄存器都来了)。如果返回的是8字节的结构体,那么她就会被存在EDX:EAX寄存器对中。如果是体积更大的结构体返回的话,那么EAX存放的将是一个指向结构体所在地址的指针。型参按照从右至左的顺序被推入栈中。
在ESI、EDI、EBX和EBP寄存器当中,如果她们在程序中被使用到的话,编译器会生成序言(prolog)和结语(epilog)代码来存储和恢复这些被使用的寄存器的内容。
再次回到刚刚提到的几种定义函数调用的修饰符上来。大家先看如下的函数定义和调用(以下代码和图片均来自MSDN):
void MyFunc( char c, short s, int i, double f )
{
}
MyFunc ('x', 12, 8192, 2.7183);
对于以上的函数定义,calltype用__fastcall、__cdecl等替代。那么,在函数调用的过程中,不同的修饰符下的内存结构如下图:
calltype = __cdecl
calltype = __stdcall 和 thiscall
calltype = __fastcall
最后,由prolog和epilog又引出了Naked Function Calls的概念。所谓Nake Function Calls就是由自己来写prolog和epilog,而不是由编译器来生成。而这里面还有很多的学问,譬如Nake Function Calls的限制,prolog和epilog应该如何写等等。以下就先给出一个Naked Function的例子吧(来自MSDN):
{
/**//* calculates i^j, assumes that j >= 0 */
/**//* prolog */
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
// store ECX and EDX into stack locations allocated for i and j
mov i, ecx
mov j, edx
}
{
int k=1; // return value
while (j-- > 0) k *= i;
__asm { mov eax, k };
}
/**//* epilog */
__asm
{
mov esp, ebp
pop ebp
ret
}
}
int main()
{
}
噢,我已经有点眩晕了。一天吃不成胖子,脑袋也装不下那么多的东西,就到这里吧。还是不要冷落WinMain,毕竟这才是主体,__stdcall只是一个修饰符而已啊。Oh, My God.
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1271重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1144对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1053在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1338所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1235在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1206在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1301在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1148昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1054昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1536由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1242今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1040为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1133昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 922使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1040这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1007今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 979在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1528昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1587很久没有用 ... -
两天四疑问
2004-09-03 10:56 10029月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
《摇摇晃晃的Gamy Wimey:Rust编程打造的Roguelite地牢探索之旅》 在游戏开发的世界里,Roguelite类型的游戏以其随机生成的地图、...通过深入研究这个项目,我们可以学习到如何用Rust创造出独特且引人入胜的游戏世界。
一年前我认识了它---jQuery,从此就一发不可收拾。有人说:jQuery是毒药,会使人不思进取,放弃原生的JavaScript的学习。不过从我的经验看来,事实并不是这样,笔者正是由于jQuery,才对JavaScript这门语言感兴趣,...
不久 Knuth 觉得此书 涉及的领域应该扩大,于是越写越多,如滔滔江水连绵不绝,又如黄河泛 滥一发不可收拾。1965 年完成的初稿居然有 3000 页,全是手写的!据出版 商估计,这些手稿印刷出来需要 2000 页,出书的...
”通过这些问题,孩子们开始在心中构建风的形象,他们的想象力像被打开的水闸,一发不可收拾。 随后,赵小艺的画作呈现了一幅小树随风摇曳的景象。老师让学生们闭上眼睛,想象自己就站在那棵小树旁,感受风的吹拂。...
如“一发不可收拾”、“黯然失色”等成语,不仅仅是记忆它们的意思,更重要的是了解它们的适用场合,以丰富语言表达,提高文学修养。 阅读理解能力的培养是语文学习的重点之一。学生通过阅读短文,不仅要理解文章的...
例如,“一发不可收”与“一发不可收拾”,虽然只有一字之差,但语义却大相径庭。学生在学习和使用的过程中,不仅需要掌握其基本含义,还需要根据不同语境灵活运用。这对于提升他们的语言表达能力和语境理解能力具有...
4. 成语与熟语的运用:如“一发不可收拾”,要求学生能够正确理解成语的含义并运用到句子中,避免语境误用。 5. 语病辨析:题目考察学生对汉语语法的掌握,找出有语病的句子,如成分残缺、搭配不当、一面对两面等...
在探讨课文内容时,学生们更是一发不可收拾地发现了太空生活的种种趣味性。宇航员的睡觉方式,必须使用特殊睡袋来防止自己在失重环境中漂浮;喝水需要特别设计的带吸管的杯子,因为任何溢出的水都可能成为危险的水珠...
比如第2题指出“一发不可收”在具体语境中使用不当,正确的表达应是“一发不可收拾”。这种题目不仅考验了学生对于词语的理解,也考查了他们在语言表达中的准确性。 在标点符号的运用上,试卷通过具体例句让学生...
- 一发不可收/一发不可收拾 通过对这些成语的辨析,我们可以提高在实际运用中的准确性,从而在高考语文中取得更好的成绩。在即学即练环节,学生需要根据语境选择正确的成语,例如题目中的例句,通过分析语境,选出...
然而,一旦火被错误使用或管理不当,就会变成一发不可收拾的灾难。因此,孩子们需要了解火的正确使用方法和潜在危险,这是防火教育的首要任务。 其次,活动通过教授消防安全标志的识别,加强孩子们的安全意识。在...
3. **词语使用**:通过辨析“中止”、“无所不至”、“一发不可收拾”和“鹅行鸭步”等成语在不同语境下的正确应用,考察学生的词汇理解和实际运用能力。例如,正确答案是A,“中止”表示停止某个行动,适合用于描述...
学生被要求不仅要理解成语“相濡以沫”、“一发而不可收拾”等的含义,还应能准确地在语境中运用它们。对于病句辨析题,学生们需要具备扎实的语法知识,能够找出句子中的逻辑错误和结构问题。另外,试卷还包含了语句...
3. **成语运用**:试题中出现了一个成语运用的选择题,如“一泄千里”在语境中使用不当,应改为“一发不可收拾”。这检验学生的成语理解和应用能力。 4. **语病辨析**:通过选择题形式,让学生判断句子是否有语病,...
看了python画小猪佩奇之后,一发不可收拾! 为了满足小朋友的愿望和自己学习的目的,就搜集缩小的网络上关于python绘画的资源! 说明 本仓库主要是学习目的,代码并非都是原创,大部分来自于网络公开资源!如有违反...
成语应用:"络绎不绝"用于形容人流量大,"一泄千里"用错,应改为"一发不可收拾";"各有千秋"表示各有特点,用于李白和杜甫的诗风对比合适;"乐此不疲"用在此处不合适,宜改为"乐在其中";"推波助澜"是贬义,用于...
在高中时,她的语文老师通过《新时代谁是最可爱的人》这篇文章,让她见识到了文字承载故事的力量,从此她对文学的追求便一发不可收拾。阅读与创作成为了她生活中不可或缺的部分,文字成了她表达内心世界的桥梁,让她...
就这样开始而一发不可收拾,从最开始的结构搭建、输出设计便沉迷此中两个月,推出的前三个版本都不太稳定,要么是兼容不好,要么是数据处理的时逻辑顺序有问题,总之在最初的三个版本在大量项目的测风数据的测试下暴...
而“一发而不可收拾”则意味着事情失控,后果严重,难以挽回。 以上这些成语的辨析对于学生来说至关重要,它们在写作和日常交流中都有广泛应用。理解并正确使用这些成语,不仅能提升语言表达的精准性,还能彰显文化...
1993年,他开始了他的Linux之旅,从此一发不可收拾。目前,他是Linux Weekly News的联合创始人和执行编辑,居住在美国科罗拉多州的博尔德市,与妻子和两个孩子共享天伦之乐。 ### Alessandro Rubini Alessandro ...