重学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进行检查,对堆栈进行平衡。

原文地址:https://www.cnblogs.com/tk091/p/2481249.html