重学C---------第一节: Hello world
Hello world是最简单的c语言程序,也是大多数程序员的开始。
1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World ! \n"); 6 }
对应的工程下载:https://files.cnblogs.com/tk091/rl001.7z
我们用OD对其进行反汇编查看(查看的是主函数):
1 00401010 |> \55 push ebp 2 00401011 |. 8BEC mov ebp,esp 3 00401013 |. 83EC 40 sub esp,0x40 4 00401016 |. 53 push ebx 5 00401017 |. 56 push esi 6 00401018 |. 57 push edi 7 00401019 |. 8D7D C0 lea edi,[local.16] 8 0040101C |. B9 10000000 mov ecx,0x10 9 00401021 |. B8 CCCCCCCC mov eax,0xCCCCCCCC 10 00401026 |. F3:AB rep stos dword ptr es:[edi] 11 00401028 |. 68 1C204200 push rl001.0042201C ; ASCII "Hello World ! 12 " 13 0040102D |. E8 2E000000 call rl001.00401060 14 00401032 |. 83C4 04 add esp,0x4 15 00401035 |. 5F pop edi 16 00401036 |. 5E pop esi 17 00401037 |. 5B pop ebx 18 00401038 |. 83C4 40 add esp,0x40 19 0040103B |. 3BEC cmp ebp,esp 20 0040103D |. E8 9E000000 call rl001.004010E0 21 00401042 |. 8BE5 mov esp,ebp 22 00401044 |. 5D pop ebp 23 00401045 \. C3 retn
然后用IDA对其进行解析,得到下面的情况
1 int __cdecl main_0() 2 { 3 char v1; 4 5 memset(&v1, 0xCCCCCCCCu, 64u); 6 printf("Hello World ! \n"); 7 return _chkesp(); 8 }
在打印之前,会先申请局部空间,然后初始化为CC,打印结束后,对esp进行检查,对堆栈进行平衡。