2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215《Linux内核原理与分析》第二周作业
这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型、X86汇编指令包括几种内存地址的寻址方式和push、pop、call、re等几个重要的汇编指令。主要分为两部分进行这周的学习总结。第一部分对学习内容进行总结,第二部分对实验进行分析(反汇编一个C程序)。
一、学习内容
1、现在计算机绝大多数采用冯诺依曼体系结构,逻辑上可以抽象成:

以程序员的角度看:

2、几种寻址方式
• movl %eax,%edx edx=eax 寄存器寻址
• movl $0x123,%edx edx=0x123 立即寻址
• movl 0x123,%edx edx=*(int32_t)0x123 直接寻址
• movl (%ebx),%edx edx=(int32_t)ebx 间接寻址
• movl 4(%ebx),%edx edx=(int32_t)(ebx+4) 变址寻址
其中%..代表寄存器,$..代表取出数据,(%..)代表取出寄存器中所存储的数据,b、w、l、q分别代表8位、16位、32位和64位。
3、push、pop、call等几个重要的汇编指令。
eg (1) pushl %eax 意思是把eax寄存器压栈。分解来看相当于第一步:subl $4 esp,第二步:movl %eax (%esp),来解释一下:首先我们要知道esp是指堆栈栈顶,那么由于栈的一般生长方向为自上向下增长,进行push压栈指令时栈顶指针向下移动4个字节(因为是32位机),之后把eax放入当前内存位置。
(2) popl %eax意思是把eax寄存器出栈。分解来看相当于第一步: movl(%esp), %eax第二步:add $4 %esp,道理同(1)逆。
(3) call 0X12345 意思是函数调用,过程是首先将当前CPU获取内存的指令压栈保存,赋予新值,CPU下次就从新地址来取指令了,即实现了函数调用。
二、实验分析
首先创建main.c文件,即:touch main.c,之后用如下命令输入一段C语言代码:
$vi main.c,之后用gedit main.c 查看编写好的C程序,如下图所示:

然后用如下命令反汇编:$gcc -S -o main.s main.c -m32,之后用gedit main.c 查看结果,如下图所示:




由于“.”开头的大都是用于链接辅助信息,实际并不会执行,所以可以直接忽略。删除所有点开头的内容,留下来的是纯汇编代码。那么此段程序简化后就变成如下形式:
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $20, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $10, (%esp)
call f
addl $30, %eax
分析如下图:


Eip寄存器 从这条指令执行完自动执行下有一条指令
Ebp寄存器 总是指向堆栈的栈底 概念的是相对的,跳出该函数进入其他函数堆栈有其相应的栈底
Esp寄存器 总是指向堆栈的栈顶
Eax寄存器 函数的返回值默认使用该寄存器存储返回给上一级函数
分析如下:
程序从main函数开始运行,因为之前还有别的代码运行,所以把当前ebp进行压栈,之后指针向下一个字节,相当于在下个字节内填充数据,之后调用f函数,而当前eip指向call f的下一条指令(eip在进行call f指令后压栈,下回跳转到eip继续执行)。那么对于即将要执行的f函数来说首先要将当前ebp压栈,那么和main函数类似,指针下移一个字节,把10放进寄存器eax中,再把寄存器eax给esp,当前eip指向call g的下一条指令(当前eip在进行call g指令后压栈),之后调用g函数,同样先将ebp压栈,之后esp,ebp指向同一个位置,之后ebp指针向上移动两个字节把当前字节内内容放到eax寄存器中,将eax储存的数加20后出栈,返回到f函数的leave命令,撤销函数堆栈后返回到main函数的leave命令,将eax的当前值30加30,之后撤销函数堆栈,返回程序运行值。
2017-2018-1 20179215《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课程--计算机是如何工作的 ...
随机推荐
- Hadoop生态优秀文章集锦
如何用形象的比喻描述大数据的技术生态?Hadoop.Hive.Spark 之间是什么关系? https://www.zhihu.com/question/27974418 HBase 和 Hive 的 ...
- 第二课 创建http server
nodejs 不需要单独安装服务器软件 tomcat .apache. iis 看下面的代码创建了http服务器,并输出一些简单的响应内容 //引入http 模块 var http = require ...
- 2.二级接口ListableBeanFactory
这个随笔主要讲的是ListableBeanFactory package org.springframework.beans.factory; import java.lang.annotation. ...
- android 自定义progressbar 样式
在res下创建drawable文件夹,新建文件drawable/progressbar_color.xml <layer-list xmlns:android="http://sche ...
- MySQL查看和修改字符集的方法
一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%';方法二:show variables like 'collat ...
- window.location.assign和window.location.href区别
window.location.assign和window.location.href区别 window.location.assign(url)和window.location.href=url实现 ...
- Data Structure Array: Program for array rotation
http://www.geeksforgeeks.org/array-rotation/ O(n), O(1) #include <iostream> #include <vecto ...
- 【leetcode刷题笔记】Edit Distance
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- hbase离线定时入库shell脚本-小栗子
#!/bin/bash #######数据类型(cdr,ims,pc,.ngn_sip)###### dir=*** ############# #原始文件地址 oripath=/bigdata/da ...
- wget 监控web服务器
wget --timeout=$timeout --tries=$times $url -q &>/dev/null --timeout=number 设定超时时间 --tries=nu ...