首页 > 代码库 > main启动函数

main启动函数

1.main函数执行前

main函数是编译环境提供给用户的入口函数,但main函数是如何执行的?它也同样作为一个函数,被另外的函数所调用执行。

利用编译器的栈回溯,可以找到编译器调用main函数的父函数(此处使用编译器为vs2010):

  在main函数内下断,让程序运行在main函数内停止;

  观察vs2010的调用堆栈窗口(可按 调试 -> 窗口 -> 调用堆栈 顺序显示该窗口);

  可发现当前栈顶指针指向 main()函数,且_tmainCRTStartup()函数比main()函数先入栈,双击tmainCRTStartup()处即可转入函数入栈前的

中断处,发现此处正调用的main函数;

(crtexe.c)

2.在main函数之前输出hello world  

问题:

//要求在*部分写代码使整个程序运行后输出“hello world”
#include "stdio.h"
void print()
{
    *
}
void main()
{
}

   

解决方案:

#include "stdio.h"
extern "C" int __cdecl mainCRTStartup(void);  //若源文件是.c结尾,不需要这一句
void print()
{ 
 #pragma comment(linker, "/entry:print")    //修改入口点代码为print函数
  #pragma comment(linker, "/SECTION:.text,ERW")   //设置代码段可读、写、执行
 #pragma comment(lib, "msvcrt.lib")    
 int mainCRTStartup();
 void main();
 
 __asm
 {
  MOV EAX, OFFSET main
  MOV BYTE PTR[EAX], 0xB8 //0xB8 机器码 相当于MOV EAX,
  MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING    //将printf语句地址放在eax+1处
  MOV WORD PTR[EAX+5], 0xE0FF //???
 
 mainCRTStartup();

 __asm
 {
  leave
  ret
 }

 SHOWSTRING:
 printf("hello,world!\n");
 __asm
 {
   xor eax,eax
   ret
 }

}
void main()
{
 }