1
2#include <stdio.h>
3
4int main( int argc, char *argv[ ], char *envp[ ] )
5{
6 printf("Hello World!");
7 return 0;
8}
#include <===> ctrl+a-> ctrl+c-> ctrl+v
main并不是C语言的真正入口函数, 它是由C语言运行时库调用的。
运行时库在调用main函数之前会做一些初始化工作...
在Debug模式下, 查看Call Stack得到
main(int 1, char * * 0x00381040, char * * 0x003810d8) line 5
mainCRTStartup() line 206 + 25 bytes
KERNEL32! 7c817077()
main函数其实是被mainCRTStartup()调用的...
而mainCRTStatrup则是被系统调用的。知之有限...希望以后能了解其详细原理。
好,OD载入...
100401005 /$ /E9 06000000 jmp main
20040100A | |CC int3
30040100B | |CC int3
40040100C | |CC int3
50040100D | |CC int3
60040100E | |CC int3
70040100F | |CC int3
800401010 >|> \55 push ebp
900401011 |. 8BEC mov ebp, esp ; ; 保存寄存器环境
1000401013 |. 83EC 40 sub esp, 40 ; ; 分配局部变量空间
1100401016 |. 53 push ebx
1200401017 |. 56 push esi
1300401018 |. 57 push edi ; ; 以上三个是C语言规范, 必须保存ebx, esi, edi这三个寄存器
1400401019 |. 8D7D C0 lea edi, dword ptr ss:[ebp-40] ; ; 系统自动分配10个4字节的栈空间
150040101C |. B9 10000000 mov ecx, 10 ; ; 循环计数器
1600401021 |. B8 CCCCCCCC mov eax, CCCCCCCC ; ; 需要初始化的数值
1700401026 |. F3:AB rep stos dword ptr es:[edi] ; ; 将edi*eax处的值置0xCCCCCCCC,
1800401028 |. 68 1C204200 push 0042201C ; /; 0042201C全局数据区字符串
190040102D |. E8 2E000000 call printf ; \printf
2000401032 |. 83C4 04 add esp, 4 ; ; 调用者平衡堆栈
2100401035 |. 33C0 xor eax, eax ; ; 将main的返回值置0
2200401037 |. 5F pop edi
2300401038 |. 5E pop esi
2400401039 |. 5B pop ebx ; ; 恢复edi, esi, ebx的值
250040103A |. 83C4 40 add esp, 40 ; ; 恢复栈空间
260040103D |. 3BEC cmp ebp, esp ; ; 比较ebp, esp
270040103F |. E8 9C000000 call _chkesp
2800401044 |. 8BE5 mov esp, ebp
2900401046 |. 5D pop ebp
3000401047 \. C3 retn
31
32