在编写win32应用程序时、都必须在源码里实现一个WinMain函数。但windows程序的执行并不是从WinMain函数开始的,首先被执行的是启动函数的相关代码,这段代码是由编译器生成的。
启动源代码:crtsrcwincmdln.c中
调用WinMain的示例
程序启动代码的汇编代码
函数的识别
编译器都使用call和ret指令来调用函数及返回调用位置。
call指令与跳转指令功能类似。不同的是,call指令保存返回信息,即将其之后的指令地址压入栈的顶部,当遇到ret指令时返回这个地址。
函数的参数
函数传递参数有3种方式,分别是栈方式、寄存器方式及通过全局变量进行隐含参数传递的方式
栈方式:注意栈平衡、按照什么顺序把参数压入栈br>
有时,编译器优化,会直接通过esp对参数进行寻址。
按寄存器传参数:
函数的返回值
函数被调用执行后,将向调用者返回1个或多个执行结果,称为函数返回值。返回值最常见的形式是return操作符,还有通过参数按传引用方式返回值、通过全局变量返同值等。
用return操作符
函数的返回值放在eax寄存器中返回,如果处理结果的大小超过eax寄存器的容量,其高32位就会放到edx寄存器中。
局部变量
没有sub esp,4 分配局部变量;而是push ecx,再用[ebp-4]访问局部变量,效果一样,都让esp-4
全局变量:
全局变量一般在.data区块的一个固定地址
数组:
文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成表31408 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!