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()
{
}

main启动函数

时间: 2024-10-12 01:42:07

main启动函数的相关文章

FreeRTOS任务暂停和启动函数

任务句柄 TaskHandle_t pump_task_handle = NULL; 任务的启动函数 if(eTaskGetState(pump_task_handle) != eRunning) vTaskResume(pump_task_handle); 任务的暂停函数 if(eTaskGetState(pump_task_handle) != eSuspended) vTaskSuspend(pump_task_handle); 问题在于,任务只有暂停之后,才能调用启动函数,因为任务在创建

【收集】启动函数

在编写Win32应用程序时,都必须在源码里实现一个WinMain函数.但Windows程序执行并不是从WinMain函数开始的,首先被执行的是启动函数相关代码,这段代码是编译器生成的.启动代码完成初始化进程,再调用WinMain函数. 对于Visual C++程序来说,它调用的是C/C++运行时启动函数,该函数负责对C/C++运行库进行初始化.Visual C++配有C运行库的源代码,可以在crtsrccrt0.c文件中找到启动函数的源代码(安装时Visual C++必须选取安装源代码选项):而

第1阶段——uboot启动函数bootm命令分析(9)

本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0"中怎么实现bootm命令启动内核. 其中bootm要做的事情:a 读取头部,把内核拷贝到合适的地方(0X30008000)b 在do_boom_linux()中把参数给内核准备好,并告诉内核参数的首地址c 在do_boom_linux()中最后使用theKernel () 引导内核. {注意:当在cmd_bootm.C中没有定义宏C

c/c++启动函数startup

__declspec(noinline) int __tmainCRTStartup( void ) { int initret; int mainret=0; int managedapp; #ifdef _WINMAIN_ _TUCHAR *lpszCommandLine; STARTUPINFOW StartupInfo; GetStartupInfoW( &StartupInfo ); #endif /* _WINMAIN_ */ #ifdef _M_IX86 /* * Enable a

(转)winmain和main入口函数比较

C/C++语言中的main函数, 经常带有参数argc, argv, 如下: int main(int argc, char** argv) int main(int argc, char* argv[]) //也可以是wchar_t 或 tchar argc 是指命令行输入参数的个数, argv存储了所有的命令行参数. 在命令行下, 每两个argv[n]之间以空格分隔. 如在命令行下输入 test.exe a b argc 为 3 argv[0] 为 "test.exe" argv[

Enerprise Solution Main 启动方法源代码

.NET 系统以Main方法作为应用程序的启动入口点,Enterprise Solution的启动程序源代码如下: [STAThread] static void Main() { string MAIN_INSTANCE_KEY = "EnterpriseMain"; SingleProgramInstance mainInstance = new SingleProgramInstance(MAIN_INSTANCE_KEY); if (!mainInstance.IsSingle

main主函数

public static void main(String[] args) { //虚拟机调用main函数,需要传个args的参数,传入的是new String[0] System.out.println(args);// 结果是一个数组实体,长度是0 } 主函数的定义:(主函数也是一个函数) public :代表该函数的访问权限是最大的 static : 代表主函数随着类的加载而加载,不用创建对象就已经存在 void: 主函数没有返回值 main: 不是关键字,是一个特殊的词,可以被JVM识

《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口

<C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户main函数. class COne { public: COne() { printf("COne \r\n"); } ~COne() { printf("~COne \r\n"); } }; COne g_One; int main() { printf("

main 主函数执行完毕后,是否可能会再执行一段代码?(转载)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon