码迷,mamicode.com
首页 > 其他好文 > 详细

main启动函数

时间:2014-05-03 23:42:10      阅读:461      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   tar   

1.main函数执行前

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

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

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

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

bubuko.com,布布扣

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

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

bubuko.com,布布扣(crtexe.c)

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

问题:

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

   
bubuko.com,布布扣

解决方案:

bubuko.com,布布扣
#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()
{
 }
bubuko.com,布布扣

 

 

main启动函数,布布扣,bubuko.com

main启动函数

标签:style   blog   class   code   java   tar   

原文地址:http://www.cnblogs.com/91Kesson/p/3705051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!