zoukankan      html  css  js  c++  java
  • 20189210牟健 《Linux内核原理与分析》第二周作业

    本周学习了汇编指令以及通过反汇编一个小程序来了解栈的变化
    写了一个简单的C程序,如图所示:

    通过gcc -s -o main.s main.c -m32指令将其编译成汇编程序
    打开该汇编文件并删除不重要的信息,如图所示:

    分析该汇编指令(为了方便直接用手写画图,为了区分不同时期的寄存器,将其后面加了个括号,括号里的数字表示该寄存器的第几种状态)
    如图所示:

    首先执行main函数
    pushl %ebp :将esp的值减4(指向下一帧栈地址),并将ebp寄存器里的值存入esp此时指向的栈地址。
    Movl %esp, %ebp :将ebp寄存器同样指向esp寄存器指向的那块栈地址。
    Sub $16, %esp :将esp寄存器的内容减16,即向下移动四个帧。
    movl $1, -12(%ebp) : 将变址地址-12(%ebp)存入立即数1
    movl $8, -8(%ebp) :将变址地址-8(%ebp)中存入立即数8
    pushl -8(%ebp) : 将上述变址地址中的内容8压入栈内。
    pushl -12(%ebp) :同样将上述变址地址中的内容1压入栈内。
    call g : 即调用g子函数,可分为 pushl eip(存储call g的下一条指令即addl $8, %esp的地址)和 movl g, eip。
    执行 g 子函数:
    pushl %ebp : 将ebp的值压入栈内。
    movl %esp, %ebp : 将ebp寄存器也指向esp所指示的位置。
    movl 8(%ebp), %edx : 将8(%ebp)中的内容1存入edx寄存器中
    movl 12(%ebp), %eax : 将12(%ebp)中的内容存入eax寄存器中
    addl %edx, %eax : 将edx和eax中的内容相加并存入eax寄存器当中
    popl %ebp : 将esp寄存器的内容加四,即向上移动一帧,将pop出的内容赋值给ebp, ebp指向之前ebp所指的位置
    如新图所示:

    ret : ret指令分为popl eip 和将eip寄存器存入保存的call指令的下条指令即 add.......
    addl $8, %esp : 将esp寄存器向上移动两帧。
    movl %eax, -4(%ebp) : 将eax的值9赋给-4(%ebp)的位置
    movl -4(%ebp), %eax : 再从那个位置赋值给eax寄存器,(之所以那么绕,我认为是因为在C语言里我定义了一个变量c来得到g函数的返回值)
    leave : 可分为 movl %ebp, %esp 和 popl ebp 即将esp指向ebp所指的位置,并将ebp以下的指令弹出,相当于清空栈。

    小结:
    在蓝墨云课堂以及庖丁解牛课本上上学习了基础汇编指令,相关寄存器的用法,多种寻址方式,对本科所学计算机组成原理的知识有了系统性的回顾。并学会了反汇编一个小程序,对计算机的栈操作有了基本的了解。
    但是在gcc测验里遇到了一些问题,后来发现是指令细节把握不够到位,也让我意识到自己对Linux的基础指令理解还不够深刻。

  • 相关阅读:
    14 微服务电商【黑马乐优商城】:day06-使用nginx反向代理并掌握cors解决跨域
    Docker容器化【Docker安装与启动&Docker镜像与容器相关命令】
    [LeetCode]Palindrome Number 验证回文数
    C++结构体定义构造函数
    C++中explicit关键字的使用
    C++ const关键字
    图像梯度(Image Gradient)
    ORB特征点匹配
    c++:internal compiler error:killked(program cclplus) 解决办法
    最小二乘通俗解释
  • 原文地址:https://www.cnblogs.com/20189210mujian/p/9824523.html
Copyright © 2011-2022 走看看