
C
driftcloudy
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从Entry Point到main函数调用(1)
(1) 之前在调试exe时感觉很奇怪,为什么Entry Point并非直接进入到main函数。举例来说,如果将一段空的C代码build为exe:void main(){ }编译环境为:VC6 release。再将该exe文件进行反汇编,那么从EP开始的代码部分大概形如:ASM代码 push ebp……一段汇编代码 ……call Main函数 ...2011-05-18 17:46:18 · 399 阅读 · 0 评论 -
从Entry Point到main函数调用(2):GetVersion
之前(1)篇中大致介绍了mainCRTStartup,但是其中一些调用到的函数并未深究,现打算逐一剖析它们。 GetVersionGetVersion函数是kernel32.dll中提供的API,用于获取当前Win平台的版本。准确的说,GetVersion可以获得3个信息:1. OSPlatformId2. OSBuildNumber3. OSMinorVersio...2011-05-19 03:16:21 · 196 阅读 · 0 评论 -
从Entry Point到main函数调用(3):_heap_init
_heap_init在(1)中提到过该函数用于分配一个堆。这个堆是动态创建的私有堆,与系统为进程分配的默认堆不同。进程启动时,系统会在进程虚拟地址空间中创建一个堆,即为进程的默认堆。默认堆的创建和回收均由系统来完成。除了默认堆,进程中还可以存在若干个私有堆。私有堆可以由进程动态创建,并且在此基础上进行内存分配、释放等操作。 _heap_init函数本质上是调用了HeapCrea...2011-05-19 14:48:14 · 353 阅读 · 0 评论 -
从Entry Point到main函数调用(4)
先撇开_ioinit()不谈,IO有点儿麻烦,待有空再去挖掘这些东西。GetCommandLineA该函数的汇编代码短得令人发指。7C812FBD mov eax, dword ptr [7C8855F4]7C812FC2 retn 可见7C8855F4是个特殊的内存地址,其中存放了一个指向命令行缓冲区的指针。通过该指针,可以访问整个exe的完整路径...2011-05-21 14:13:51 · 184 阅读 · 0 评论 -
从Entry Point到main函数调用(5):_cinit
_cinit在完成了_setargv() 以及_setenvp() 之后,进入到_cinit 函数。该函数的注释很短,就一句“do C data initialize”,让人完全摸不着头脑。不过不用着急,可以阅读_cinit 函数的实现来加以分析。 _cinit 函数很短,大致上分为三个步骤:1. _fpmath() 或者 (*_FPinit)();2. _initte...2011-05-27 15:07:23 · 383 阅读 · 0 评论 -
从Entry Point到main函数调用(6):exit
本章是该系列最后一篇,打算看一下 exit 函数中究竟做了些什么。 main函数的返回值在第(5)篇里完成了_cinit() 的分析之后,mainCRTStartup中接下来代码是:__initenv = _environ;mainret = main(__argc, __argv, _environ);exit(mainret);很显然, 其实main函数是可...2011-05-28 20:31:32 · 271 阅读 · 0 评论 -
一个有趣的C语法
今天阅读代码时第一次碰到形如:#include <stdio.h>void main(){ printf("%d\n", add(2,3)); getchar();}int add(a, b)int a;int b;{ return a+b;}这里定义函数add时,参数列表中没有指明形参a、b的类型,反而在 int add(a, ...2011-06-02 00:48:06 · 205 阅读 · 0 评论