本周学习了汇编指令以及通过反汇编一个小程序来了解栈的变化
写了一个简单的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的基础指令理解还不够深刻。

20189210牟健 《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  10. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

随机推荐

  1. 更改Jenkins的workspace目录

    系统管理→系统设置→主目录(的右边问号下面)→高级(是不是忽略了啊\(^o^)/~)→工作空间根目录 点开后面的问号可以看见3个参数(配置路径需要的): ${JENKINS_HOME} — Jenki ...

  2. 跟踪调试JDK源码时遇到的问题及解决方法

    目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...

  3. Spring Security 之基本概念

    Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Spring S ...

  4. Apache Ambari安装过程(CentOS 6.5)

    一.准备环境 1.host 本人准备了三台服务器, vim /etc/hosts 192.168.1.131 dk11 192.168.1.132 dk21 192.168.1.133 dk31 2. ...

  5. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  6. 服务器资源迁移到aliyun对象存储及oss的权限管理配置

    chinasoft-download增值服务的迁移和部署 需求: 增值服务网站需要从网宿迁移到阿里云,以前的增值服务历史软件存放在服务器中需要迁移到阿里云的oss中存放 需要改造程序给程序添加一个os ...

  7. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  8. unity setactive的使用

    1.可以用本身移出布局来实现隐藏 2.RawImage的texture的设置生成的一定要及时消除,避免内存泄漏

  9. laravel 汇总数据

    public function userInfluenceCollect(Request $request) { $types = ['logins', "checkins", & ...

  10. kali linux networking scanning Cookbok (第三章结尾笔记)

    1.Zombie Scanning with Nmap Zombie scans can also be performed with an option in Namp ,  we can find ...