`

一发不可收拾的学习

阅读更多

        昨天还在感叹自己面对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    calltype MyFunc( char c, short s, int i, double f );

void    MyFunc( char c, short s, int i, double f )
{
    
}


MyFunc (
'x'1281922.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):

__declspec(naked) int __fastcall  power(int i, int j) 
{
    
/**//* 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.

分享到:
评论

相关推荐

    wibbly-wobbly-gamy-wimey:这个仓库开始为GGJ2021创建一个roguelite地牢搜寻器,然后变得一发不可收拾

    《摇摇晃晃的Gamy Wimey:Rust编程打造的Roguelite地牢探索之旅》 在游戏开发的世界里,Roguelite类型的游戏以其随机生成的地图、...通过深入研究这个项目,我们可以学习到如何用Rust创造出独特且引人入胜的游戏世界。

    jquery详解,帮您增添页面效果

    一年前我认识了它---jQuery,从此就一发不可收拾。有人说:jQuery是毒药,会使人不思进取,放弃原生的JavaScript的学习。不过从我的经验看来,事实并不是这样,笔者正是由于jQuery,才对JavaScript这门语言感兴趣,...

    LaTeX学习日记(包老师)

    不久 Knuth 觉得此书 涉及的领域应该扩大,于是越写越多,如滔滔江水连绵不绝,又如黄河泛 滥一发不可收拾。1965 年完成的初稿居然有 3000 页,全是手写的!据出版 商估计,这些手稿印刷出来需要 2000 页,出书的...

    小学二年级语文画风PPT学习教案.pptx

    ”通过这些问题,孩子们开始在心中构建风的形象,他们的想象力像被打开的水闸,一发不可收拾。 随后,赵小艺的画作呈现了一幅小树随风摇曳的景象。老师让学生们闭上眼睛,想象自己就站在那棵小树旁,感受风的吹拂。...

    六年级语文下册基础知识汇总练习题.doc

    如“一发不可收拾”、“黯然失色”等成语,不仅仅是记忆它们的意思,更重要的是了解它们的适用场合,以丰富语言表达,提高文学修养。 阅读理解能力的培养是语文学习的重点之一。学生通过阅读短文,不仅要理解文章的...

    浙江省湖州市菱湖中学2020学年高二语文下学期3月月考试题(含解析).doc

    例如,“一发不可收”与“一发不可收拾”,虽然只有一字之差,但语义却大相径庭。学生在学习和使用的过程中,不仅需要掌握其基本含义,还需要根据不同语境灵活运用。这对于提升他们的语言表达能力和语境理解能力具有...

    高中语文 第一次月考试题 新人教版必修4.doc

    4. 成语与熟语的运用:如“一发不可收拾”,要求学生能够正确理解成语的含义并运用到句子中,避免语境误用。 5. 语病辨析:题目考察学生对汉语语法的掌握,找出有语病的句子,如成分残缺、搭配不当、一面对两面等...

    人教版小学语文二年级(下册)_18.太空生活趣事多(课堂实录).doc

    在探讨课文内容时,学生们更是一发不可收拾地发现了太空生活的种种趣味性。宇航员的睡觉方式,必须使用特殊睡袋来防止自己在失重环境中漂浮;喝水需要特别设计的带吸管的杯子,因为任何溢出的水都可能成为危险的水珠...

    浙江省湖州市菱湖2018_2019学年高二语文下学期3月月考试题含解析.doc

    比如第2题指出“一发不可收”在具体语境中使用不当,正确的表达应是“一发不可收拾”。这种题目不仅考验了学生对于词语的理解,也考查了他们在语言表达中的准确性。 在标点符号的运用上,试卷通过具体例句让学生...

    【创新设计】2016高考语文总复习练习 第1单元 第1课时 成语基础梳理复习课6 新人教版

    - 一发不可收/一发不可收拾 通过对这些成语的辨析,我们可以提高在实际运用中的准确性,从而在高考语文中取得更好的成绩。在即学即练环节,学生需要根据语境选择正确的成语,例如题目中的例句,通过分析语境,选出...

    消防知识大闯关 (2).doc

    然而,一旦火被错误使用或管理不当,就会变成一发不可收拾的灾难。因此,孩子们需要了解火的正确使用方法和潜在危险,这是防火教育的首要任务。 其次,活动通过教授消防安全标志的识别,加强孩子们的安全意识。在...

    浙江省杭州地区_高二语文上学期期中联考试题.doc

    3. **词语使用**:通过辨析“中止”、“无所不至”、“一发不可收拾”和“鹅行鸭步”等成语在不同语境下的正确应用,考察学生的词汇理解和实际运用能力。例如,正确答案是A,“中止”表示停止某个行动,适合用于描述...

    黑龙江省双鸭山市第一中学2020学年高一语文9月月考试题新人教版.doc

    学生被要求不仅要理解成语“相濡以沫”、“一发而不可收拾”等的含义,还应能准确地在语境中运用它们。对于病句辨析题,学生们需要具备扎实的语法知识,能够找出句子中的逻辑错误和结构问题。另外,试卷还包含了语句...

    湖北省襄阳市张家集镇中学2020届九年级语文上学期第一次月考试题.doc

    3. **成语运用**:试题中出现了一个成语运用的选择题,如“一泄千里”在语境中使用不当,应改为“一发不可收拾”。这检验学生的成语理解和应用能力。 4. **语病辨析**:通过选择题形式,让学生判断句子是否有语病,...

    pythonPainting:python绘画练习,代码并非都是原创,大多数来自于网络公开资源!

    看了python画小猪佩奇之后,一发不可收拾! 为了满足小朋友的愿望和自己学习的目的,就搜集缩小的网络上关于python绘画的资源! 说明 本仓库主要是学习目的,代码并非都是原创,大部分来自于网络公开资源!如有违反...

    成语运用与病句修改复习试题(卷)与答案.doc

    成语应用:"络绎不绝"用于形容人流量大,"一泄千里"用错,应改为"一发不可收拾";"各有千秋"表示各有特点,用于李白和杜甫的诗风对比合适;"乐此不疲"用在此处不合适,宜改为"乐在其中";"推波助澜"是贬义,用于...

    小学语文经典美文我的写作心路

    在高中时,她的语文老师通过《新时代谁是最可爱的人》这篇文章,让她见识到了文字承载故事的力量,从此她对文学的追求便一发不可收拾。阅读与创作成为了她生活中不可或缺的部分,文字成了她表达内心世界的桥梁,让她...

    自己开发的风资源分析工具包WindAnalysis-WindAnalysis风数据分析工具包教程-V1.4.pdf

    就这样开始而一发不可收拾,从最开始的结构搭建、输出设计便沉迷此中两个月,推出的前三个版本都不太稳定,要么是兼容不好,要么是数据处理的时逻辑顺序有问题,总之在最初的三个版本在大量项目的测风数据的测试下暴...

    2013年高考语文 基础知识备考 易混淆的成语

    而“一发而不可收拾”则意味着事情失控,后果严重,难以挽回。 以上这些成语的辨析对于学生来说至关重要,它们在写作和日常交流中都有广泛应用。理解并正确使用这些成语,不仅能提升语言表达的精准性,还能彰显文化...

    Linux设备驱动程序(第三版) - AUTHOR.COLO

    1993年,他开始了他的Linux之旅,从此一发不可收拾。目前,他是Linux Weekly News的联合创始人和执行编辑,居住在美国科罗拉多州的博尔德市,与妻子和两个孩子共享天伦之乐。 ### Alessandro Rubini Alessandro ...

Global site tag (gtag.js) - Google Analytics