欢迎光临!
若无相欠,怎会相见

反汇编学习-C语言实例解析精粹-第一个C程序

序言

一直在学习,就是没输出。这就很不对了,只学习没输出,这非常不好,因此在这个日子,我还是要花点时间整理一下自己的所学内容。

现在在学C语言,算是比较底层的了,但是反汇编是更底层,因此我就从写C语言代码来学习反汇编,如果我能把C语言的结构与汇编代码能对应上,应该就能学的很好了。

正向代码

第一个程序很简单,就是一个打印“Hello World!”

#include <stdio.h>
main()
{
    printf("Hello World!\n");
}

汇编代码

我当时用的是 VS6.0,进入DEBUG调试,然后复制出如下代码:

--- c:\documents and settings\admin\桌面\project\c语言\no.1.c  ------------------------------------------------------------------
1:    #include <stdio.h>
2:
3:    main()
4:    {                            # 这里是执行main函数执行的操作,首先开辟栈空间,然后保存现场
00401010   push        ebp         # 将原ebp压入堆栈中
00401011   mov         ebp,esp     # 另ebp的值等于esp
00401013   sub         esp,40h     # 提升堆栈40h(十六进制)
00401016   push        ebx         # 保存现场
00401017   push        esi         # 保存现场
00401018   push        edi         # 保存现场
00401019   lea         edi,[ebp-40h]  # 将ebp-40h 的地址存入edi中
0040101C   mov         ecx,10h        # 设置计数器 16
00401021   mov         eax,0CCCCCCCCh # 将CCCCCCCC存入eax中
00401026   rep stos    dword ptr [edi] # 向 edi 中的堆栈地址开始循环写入CCCCCCCC 16次,在硬编码中,CPU遇到CC会暂停执行
5:        printf("Hello World!\n");
00401028   push        offset string "Hello World!\n" (0042001c)   # 将内存中的Hello World!存入堆栈,内存地址为0042001c
0040102D   call        printf (00401060)   # 调用printf函数
00401032   add         esp,4     # 外平栈
6:    }
00401035   pop         edi    # 恢复现场
00401036   pop         esi
00401037   pop         ebx
00401038   add         esp,40h
0040103B   cmp         ebp,esp
0040103D   call        __chkesp (004010e0)
00401042   mov         esp,ebp
00401044   pop         ebp
00401045   ret

这里面有几个基础汇编指令,很简单,

结语

现在夜深了,后面有遗漏,在补上

如有错误,敬请指出,感谢指正!                     — 2019-05-10  23:03:11   于苏州

 

赞(1) 打赏
转载请注明:飘零博客 » 反汇编学习-C语言实例解析精粹-第一个C程序
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临