zoukankan      html  css  js  c++  java
  • 重学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进行检查,对堆栈进行平衡。

  • 相关阅读:
    Android 序列化 反序列功能
    Android两个应用之间共享数据之SharedPrefence
    利用Asp.Net的Identity控制登录权限
    基元类型
    CLR概述
    python中的函数-基础
    较为复杂的sql
    oracle中的替换字段字符串的方法
    使用Sql查看表对应的外键关系。
    js中的除法
  • 原文地址:https://www.cnblogs.com/tk091/p/2481249.html
Copyright © 2011-2022 走看看