几个重要的寄存器

eip - 用于存放当前所执行的指令地址

esp - 栈(顶)指针寄存器

ebp - 基址(栈底)指针寄存器

简单的C程序

 int g(int x)
 {
   ;
 }

 int f(int x)
 {
   return g(x);
 }

 int main(void)
 {
   ) + ;
 }

汇编代码分析

 g:
  pushl %ebp
  movl %esp, %ebp
 ;下面两条指令的含义是:将传入的参数7和10相加并保存在寄存器eax中
  movl (%ebp), %eax
  addl $, %eax
  popl %ebp
  ret
 f:
  pushl %ebp
  movl %esp, %ebp
  subl $, %esp
 ;下面两句指令的含义是:将参数7保存到函数f的栈帧中
  movl (%ebp), %eax
  movl %eax, (%esp)
  call g
  leave
  ret

 main:
  pushl %ebp
  movl %esp, %ebp
  subl $, %esp
  movl $, (%esp)
  call f
  addl $, %eax
  leave
  ret

针对上面的汇编代码,我们有如下的图例分析

说明:

  • 在执行call指令时,eip的所指向的指令是addl $5, %eax

  • call 指令等价于,将eip中的地址压栈保存,然后将函数f第一条指令(pushl %ebp)的地址放到eip中。

  • pushl、popl、leave、ret和call指令的等价指令如下
    pushl %eax ;将eax中的值压栈保存
    <=>
    subl $4, %esp
    movl %eax, (%esp)
    popl %eax      
       <=>    
    movl (%esp), %eax
    addl $4, %esp
    call 0x12345
    <=>
    pushl %eip(*)
    movl $0x12345, %eip(*)
    ret ; 将栈顶值弹出放到eip中,此时eip中的值便是将要执行的指令的地址
    <=>
    popl %eip(*)
    leave ;恢复所调用程序的堆栈
    < =>
    movl %ebp, %esp
    popl %ebp
    enter ;与leave指令的操作相反
    <=>
    pushl %ebp
    movl %esp, %ebp

一个简单C程序的汇编代码分析的更多相关文章

  1. 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码

    1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...

  2. 简单C程序生成的汇编代码分析

    首先给出完整的C代码: int g(int x) { ; } int f(int x) { return g(x); } int main(void) { )+; } 使用命令:gcc –S –o h ...

  3. Linux内核分析—完成一个简单的时间片轮转多道程序内核代码

    ---恢复内容开始--- 20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  4. 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析

    一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...

  5. Arachnid包含一个简单的HTML剖析器能够分析包含HTML内容的输入流

    Arachnid是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并 ...

  6. 关于SIGSLOT的一个简单的程序

    废话少说直接看代码即可,这只是一个简单的程序,可以帮我们简单地明白SIGSLOT是怎么回事.至于深入研究自己去百度吧. #include "sigslot.h" using nam ...

  7. start_kernel之前的汇编代码分析

    start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...

  8. python定义的一个简单的shell函数的代码

    把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...

  9. STM32F103 ucLinux开发之二(内核启动汇编代码分析)

    start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...

随机推荐

  1. 转载自php100中文网 centos下lamp 环境搭建

    学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...

  2. 【结构型】Decorate模式

    装饰模式主要意图是为对象扩展额外的职责,但对于用户来说,在使用行为上并没有任何的变化.在此举一个例子来解释该模式的含义.假如你手上有一张照片,此时可以给它盖上一片玻璃片,同时再套上一个精美的相框.如此 ...

  3. DEIVER_OBJECT结构参数

    typedef struct { PDEVICE_OBJECT DeviceObject; //指向驱动程序创建的设备对象 PUNICODE_STRING HardwareDatabase; //记录 ...

  4. GitHub与VS2013完成项目管理

    https://github.com 程序员应该去注册一个账号的网站 1.创建一个仓库 登录你的github网站:找到新建一个仓库的入口 一些基本信息填写完毕后,点击创建,即可拥有一个仓库 2. 让V ...

  5. Codeforces 704D Captain America

    题意:平面上有n个点,每个点必须涂成红色和蓝色中的一种,花费各为r和b(对所有的点花费都一样).m条限制,每条限制形如"y=b这条直线上两种颜色的点的数目之差的绝对值不能超过c"或 ...

  6. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  7. Python Cookbook笔记

    字符串:s.strip()  删除字符串开始和结尾的空白字符. s.lstrip() 删除左边的,s.rstrip()  删除右边的. 随机数:random.random()  生成0-1之间的数. ...

  8. 【C#基础】实现URL Unicode编码,编码、解码相关整理

    1.Unicode编码 引用系统 System.Web using System.Web; string postdata = "SAMLRequest=" + HttpUtili ...

  9. StringBuffer和StringBuilder使用方法比較

    StringBuffer是字符串缓冲区,是一个容器. 特点: 1,长度是可变化的. 2,能够字节操作多个数据类型. 3,终于会通过toString方法变成字符串. C create U update ...

  10. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...