设为首页 加入收藏

TOP

议某公司一笔试题
2014-11-24 01:23:06 来源: 作者: 【 】 浏览:7
Tags:公司 试题

某公司笔试题


#include “stdio.h”
void print()
{
*
}


void main()
{
}


在*号处加一段代码,使程序打印出”hello,world”.


庄sir的解法:


//hello.c by MentalDease
#include “stdio.h”


void print()
{
#pragma comment(linker, “/entry:print”)
#pragma comment(linker, “/SECTION:.text,REW” )
int mainCRTStartup();
void main();


__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x
MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX
}


mainCRTStartup();


SHOWSTRING:
printf (“i am MentalDease\n”);
getchar();


}


void main()
{
}


很多运行库函数是其他代码执行的基础。这意味着,必须在执行用户代码(程序开发者编写的代码)之前初始化运行库。我们知道程序是从入口函数开始执行的,所以要在入口函数开始或者之前调用运行库的初始化函数。


事实上,编译器会为每个模块自动插入一个入口函数,这个函数进行好各种初始化工作之后再调用用户的入口函数,在用户的入口函数返回之后再运行自己的清理函数。这个编译器插入的入口函数即称为CRT(C Run Time)入口函数:


CRTmainStartUp()


{


CRT Init();


Call main();


CRT CleanUp();


}


默认情况下,链接器会将CRT入口函数注册为模块的入口。不过连接器支持通过/entry:function 选项指定其他函数作为入口。


#pragma comment(linker, “/entry:print”)


把程序的入口点设为print函数


MainCRTStartup是C运行期库的初始化函数。CRT堆必须在用户代码调用之前被初始化好,即在入口函数之前调用运行库的初始化函数。我们在设定函数入口为print函数之后,必须显示调用mainCRTStartup。


main CRT入口:mainCRTStartup


WinMain CRT入口:WinMainCRTStartup


DLL模块的CRT入口函数是 _DllMainCRTStartup


CRT 源码 crt0.c 中包含了CRT入口函数的代码,CRT入口函数的初始化工作主要有以下几项:


__security_init_cookie 初始化安全Cookie


_heap_init 创建和初始化CRT堆


_mtinit 初始化多线程支持


_ioinit 初始化低级IO


_cinit 初始化C和C++数据


… …


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一次失败的笔试:java++c++ 下一篇c/c++ 程序员笔试面试题型

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: