zoukankan      html  css  js  c++  java
  • 第五周博客实践分析

    第五周博客实践分析

    补充内容

    用vim编辑器编写代码:

    查看汇编文件:

    去掉以.开头的语句后的汇编代码:

    分析如下:

    main:开始执行,保存%ebp,并设置新的帧指针

     pushl   %ebp
     movl    %esp,%ebp
    
    pushl $8
    ```分配4字节的栈空间,并且设置arg1=8,相当于
    
    

    subl $4,%esp
    movl $8,(%esp)

    
    call调用```f```:
    
    
    ```f```同样初始化帧指针,分配栈空间
    
    
    pushl   %ebp
    movl    %esp,%ebp
    
    
    ```pushl 8(%ebp)```将```%esp```中的8存入栈中,相当于
    
    

    subl $4,%esp
    movl 8(%ebp),%eax

    
    call调用g:
    g被调用,初始化栈指针,分配栈空间
    将 %eax 与立即数 4 相加
    
    

    addl $4,%eax

    
    在a结束前弹栈
    
    

    popl %ebp

    
    ret返回f中call的调用位置
    f也结束,return返回main中call调用的位置
    main继续 %eax 加2的操作
    
    

    addl $2,%eax

    leave为返回准备栈,相当于%ebp出栈,最后ret结束
    
    
    ###图示如下
    
    ![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161203150037662-311386705.png)
    
    ##GDB调试
    
    使用```gcc - g example.c -o example -m32```指令产生32位汇编,然后使用```gdb shiyanlou```指令进入gdb调试器:
    
    ![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161204102922740-1650365938.png)
    
    进入之后先在```main```函数处设置一个断点,再run一下,使用```disassemble```指令获取汇编代码,用```i(info) r(registers)```指令查看各寄存器的值:
    
    ![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161206184921944-1702270414.png)
    
    
    
    
     
    
    依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
    
    

    1、使用si指令单步跟踪一条机器指令
    2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
    3、使用x/na %esp对应的值指令查看堆栈变化

    
     
    
    |指令|	%eip|	%ebp|	%esp|	%eax	|堆栈|
    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|:-----:|
    |push $0x13|	0x80483f9|	0xffffd058|	0xffffd058|	0xf7fbadbc|	0x00000000|
    |call 0x80483e6|	0x80483fb|	0xffffd058|	0xffffd054|	0xf7fbadbc|	0x13 0x0|
    |push %ebp	|0x80483e6|	0xffffd058|	0xffffd050|	0xf7fbadbc|	0x8048400 0x13 0x0|
    |mov %esp,%ebp|	0x80483e7|	0xffffd058|	0xffffd04c|	0xf7fbadbc|	0xffffd058 0x8048400 0x13 0x0|
    |pushl 0x8(%ebp)|	0x80483e9|	0xffffd04c|	0xffffd04c|	0xf7fbadbc|	0xffffd058 0x8048400 0x13 0x0|
    |call 0x80483db	|0x80483ec|	0xffffd04c|	0xffffd048|	0xf7fbadbc|	0x13 0xffffd058 0x8048400 0x13 0x0|
    |push %ebp|	0x80483db|	0xffffd04c|	0xffffd044|	0xf7fbadbc|	0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |mov %esp,%ebp|	0x80483dc|	0xffffd04c|	0xffffd040|	0xf7fbadbc|	0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |mov 0x8(%ebp),%eax|	0x80483de|	0xffffd040|	0xffffd040|	0xf7fbadbc|	0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |add $0x13,%eax|	0x80483e1|	0xffffd040|	0xffffd040|	0x13|	0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |pop %ebp|	0x80483e4|	0xffffd040|	0xffffd040|	0x26|	0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |ret|	0x80483e5|	0xffffd04c|	0xffffd044|	0x26|	0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
    |add $0x4,%esp|	0x80483f1|	0xffffd04c|	0xffffd048|	0x26|	0x13 0xffffd058 0x8048400 0x13 0x0|
    |leave|	0x80483f4|	0xffffd04c|	0xffffd04c|	0x26|	0xffffd058 0x8048400 0x13 0x0|
    |ret|	0x80483f5|	0xffffd058|	0xffffd050|	0x26|	0x8048400 0x13 0x0|
    |add $0x4,%esp|	0x8048400|	0xffffd058|	0xffffd054|	0x26|	0x13 0x0|
    |add $0x13,%eax|	0x8048403|	0xffffd058|	0xffffd058|	0x26|	0x0|
    |leave	|0x8048406|	0xffffd058|	0xffffd058|	0x39|	
    |ret|	0x8048407|	0x0|	0xffffd05c|	0x39|
  • 相关阅读:
    jQuery源码——.html()方法原理解析
    【翻译】JavaScript内存泄露
    【翻译】ES6生成器简介
    浅谈事件冒泡
    Github page搭建博客使用自定义插件的方法
    【翻译】JavaScript中5个值得被广泛使用的数组方法
    【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
    《JQuery技术内幕》读书笔记——自调用匿名函数剖析
    解决transition动画与display冲突的几种方法
    JavaScript递归中的作用域问题
  • 原文地址:https://www.cnblogs.com/ZouJR/p/6128734.html
Copyright © 2011-2022 走看看