• 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的基础指令理解还不够深刻。

  • 相关阅读:
    你真的了解HTML吗?–雅虎面试题
    移动端meta 解释
    PLSQL导入导出表的正确步骤
    Linux命令学习之xargs命令
    python搭建简易Web Server
    python小项目练习之转换像素图片为字符图
    向量空间搜索引擎基本理论
    Elasticsearch 常用基本查询
    Elasticsearch配置参数介绍
    JavaWeb温习之防止表单重复提交
  • 原文地址:https://www.cnblogs.com/20189210mujian/p/9824523.html
Copyright © 2020-2023  润新知