• 2017-2018-1 20179209《Linux内核原理与分析》第二周作业


    • 本周课业主要通过分析汇编代码执行情况掌握栈的变化。本人本科时期学过intel 80X86汇编语言,所以有一定基础;在Linux中32位AT&T风格的汇编稍微熟悉就可以明白。所以我学习的重点放在了栈变化上。
      首先是编写简单的C源程序:

         反汇编之后得到汇编代码:
      

        接着实验的重点来了,我每执行两个指令都会解释当前运行情况以及栈的变化:
    
         pushl    %ebp
         movl     %esp, %ebp
    


    把ebp当前的指向的地址压栈;把esp的地址给了ebp。

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


    把esp向下移动一格,并把88压栈;
    我在思考是否这两条指令可以用pushl $88代替?
    call f

    call命令可以分成两个命令来执行分别是保存当前eip地址以及跳转,这里不再赘述。

         pushl    %ebp
         movl    %esp,%ebp
    


    这一步骤类似main函数 第一二个指令。

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


    这两条命令的关键是把88这个值加到eax寄存器中。所以执行完后eax的值变成了88.

        movl    %eax,(%esp)
        call    g
    


    这里把eax中的值也存到了栈中,然后调用g函数。

        pushl    %ebp
        movl    %esp,%ebp
    

        movl    8(%ebp),%eax
        addl    $33,%eax
    

        popl    %ebp
        ret
    


    这里调用第一个ret函数,这个过程类似中断,这一步骤相当于恢复上一个现场。

        leave
    


    leave 函数相当于movl %esp,%ebp和popl %ebp

        ret
    

        addl    $11,%eax
    


    运行结束后:

    通过整个过程的追踪遍历,我更加清晰地明白了栈的工作过程。这个过程自己看再加上自己写出来,我一共推导了3遍。我觉得这对我以后学习系统调用和中断也有很大的帮助。至于上面思考的问题,能不能用一个命令代替两个命令,我觉得可以,因为intel 80X86中的push可以直接对立即数进行压栈。

  • 相关阅读:
    [PHP]算法-归并排序的PHP实现
    [PHP] 数据结构-二叉树的创建PHP实现
    [PHP] 数据结构-循环链表的PHP实现
    [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现
    [PHP] 算法-两个n位的二进制整数相加问题PHP实现
    [PHP] 数据结构-线性表的顺序存储结构PHP实现
    [日常] 链表-头结点和头指针的区别
    [日常] C语言中指针变量
    [日常] 算法-单链表的创建-尾插法
    [日常] 算法-单链表的创建
  • 原文地址:https://www.cnblogs.com/genius-sen/p/7638399.html
Copyright © 2020-2023  润新知