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的基础指令理解还不够深刻。
20189210牟健 《Linux内核原理与分析》第二周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
随机推荐
- PYTHON使用入门
一 写在开头1.1 本文内容PYTHON语言的基础知识. 二 Q & A2.1 为什么选择PYTHON?软件质量:在很大程度上,PYTHON更注重可读性.一致性和软件质量,从而与脚本语言世界中 ...
- UE导航系统详
配置 Navigation Crowd Manager Class 代理人管理类 可以自定义个 Navigation System Auto Create Navigation Data 导航数据在没 ...
- 2018-2019-1 20189208《Linux内核原理与分析》第八周作业
学习笔记 1.ELF目标文件格式 编译器生成目标文件,目标文件与目标平台二进制兼容. ELF:可执行或可链接的格式,是目标文件格式标准. ELF类型: 可重定位文件:编译器汇编器创建的 .o 文件,最 ...
- javascipt继承机制(from阮一峰)
Javascript继承机制的设计思想 我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类" ...
- [加密解密]CryptoAPI简介
CryptoAPI概述 Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API.它提供了在Win32 环境下使用认证.编码.加密和签名 ...
- mysql join on and
2018-6-4 10:28:50 星期一 开发中一直在用 left join, 心中只有一丝丝的了解, 还都是学校里学的, 今天看了几遍文章这里记录一下 sql的left join .right j ...
- javaWeb之使用servlet搭建服务器入门
servlet: 百度百科说法: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改 ...
- Scapy
1.UDP scanning with Scapy Scapy is a tool that can be used to craft and inject custom packets into ...
- 使用OpenCV训练好的级联分类器识别人脸
一.使用OpenCV训练好的级联分类器来识别图像中的人脸 当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载: OpenCV分类器 import cv2 # 矩形颜色和描边 color ...
- php判断浏览器还是微信打开
本人亲测,但是存在一个小问题,就是用此方法在手机端打开会显示Google Chrome,但是在PC端是没有问题的,现在还在测试,先把第一版代码分享给大家! if(strpos($_SERVER['HT ...