首页 > 代码库 > 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() { }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。