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

1.汇编与寄存器的学习

寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。

  寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

寄存器用途:

  1.可将寄存器内的数据执行算术及逻辑运算;

  2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;

  3.可以用来读写数据到电脑的周边设备。

操作寄存器的寻址方式有七种

立即寻址方式(Immediate addressing)

寄存器寻址方式(Register addressing)

直接寻址方式(Direct addressing)

寄存器间接寻址方式(Register indirect addressing)

寄存器相对寻址方式(Register relative addressing)

基址变址寻址方式(Based indexed addressing)

相对基址变址寻址方式(Relative based indexed addressing)

2.实验过程

首先熟悉一下vim操作

然后测试的代码

int g(int x)
{
return x+5;
} int f(int x)
{
return g(x);
} int main(void){
return f(8)+1;
}

输入gcc -S -o main.s main.c -m32得到main.s的汇编文件,可以用vi main.s打开得到的汇编代码与实验楼得到的代码有所区别。

1.file   "main.c"
2 .text
3 .globl g
4 .type g, @function
5 g:
6 .LFB0:
7 .cfi_startproc
8 pushl %ebp
9 .cfi_def_cfa_offset 8
10 .cfi_offset 5, -8
11 movl %esp, %ebp
12 .cfi_def_cfa_register 5
13 movl 8(%ebp), %eax
14 addl $5, %eax
15 popl %ebp
16 .cfi_restore 5
17 .cfi_def_cfa 4, 4
18 ret
19 .cfi_endproc
20 .LFE0:
21 .size g, .-g
22 .globl f
23 .type f, @function
24 f:
25 .LFB1:
26 .cfi_startproc
27 pushl %ebp
28 .cfi_def_cfa_offset 8
29 .cfi_offset 5, -8
30 movl %esp, %ebp
31 .cfi_def_cfa_register 5
32 pushl 8(%ebp)
33 call g
34 addl $4, %esp
35 leave
36 .cfi_restore 5
37 .cfi_def_cfa 4, 4
38 ret
39 .cfi_endproc
40 .LFE1:
41 .size f, .-f
42 .globl main
43 .type main, @function
44 main:
45 .LFB2:

然后输入g^.s*/d发现指令不能用,便手动dd删除之得到

1 g:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %eax
5 addl $5, %eax
6 popl %ebp
7 ret
8 f:
9 pushl %ebp
10 movl %esp, %ebp
11 pushl 8(%ebp)
12 call g
13 addl $4, %esp
14 leave
15 ret
16 main:
17 pushl %ebp
18 movl %esp, %ebp
19 pushl $8
20 call f
21 addl $4, %esp
22 addl $1, %eax
23 leave
24 ret

刚开始对于一下片段在各函数头出现感到困惑

        pushl   %ebp
movl %esp, %ebp

在查阅资料后了解到在函数调用过程中,ebp和esp之间的空间被称为本次函数调用的“栈帧”。函数调用结束后,处于栈帧之前的所有内容都是本次函数调用过程中分配的临时变量,都需要被“返还”。这样在概念上,给了函数调用一个更明显的分界。下图是一个程序运行的某一时刻的栈帧图:

另一个问题就是对于所谓的堆栈空间,esp,和ebp作为栈顶和栈底都可以变化,这点与数据结构中严格的堆栈定义有所区别,更有点像队列的,但是因为其作为寄存器保存到是对应内存的地址其实也是合理的。

2.代码对应的汇编执行的过程

函数是从main开始执行的,所以17.18

行建立主函数的堆栈空间,19行将立即数8压入内存中的堆栈空间作为f函数,此时修改了EIP寄存器,指令跳转到第8行f函数处。f函数前两行功能同主函数,第十一行将ebp中保存的堆栈底号加8压入堆栈空间,同时esp下移,此时栈顶指针对应内存空间保存的参数8在下一行call g中被g函数调用。然后g函数在四五行中将计算结果存入eax寄存器中被返回22行,将计算结果加1重新存入eax寄存器中。

2019-2020-1 20199303<Linux内核原理与分析>第二周作业的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 本地图片上传到GitHub,MarkDown使用Github图片地址

    最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...

  2. UnityScript基础

    基本格式 1 cc.Class({ 2 extends: cc.Component, 3 4 properties: { 5 }, 6 7 // use this for initialization ...

  3. 配置Office Excel运行Python宏脚本

    基本环境 名称 版本 操作系统 Windows 10 x64 Office 2016 安装Python 1.下载Python安装包 登录https://www.python.org/downloads ...

  4. [Python] 常见的排序与搜索算法

    说明: 本文主要使用python实现常见的排序与搜索算法:冒泡排序.选择排序.插入排序.希尔排序.快速排序.归并排序以及二分查找等. 对算法的基本思想作简要说明,只要理解了基本的思想,与实现语言无关. ...

  5. 奶牛跟蜗牛,哪种动物智商更高?——T检验帮你找到答案

    奶牛跟蜗牛,都是“牛”,那么哪种动物更“牛”,智商更高呢?此时就能用到T检验来找答案~   T 检验(独立样本 T 检验),用于分析定类数据与定量数据之间的关系情况.例如,在本研究中,我们想探究奶牛跟 ...

  6. 01 Python 基础数据类型

    基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余  + - * / ** %...2.bool 布尔值 判断真假以及作为条件变量3.str 字符串 存 ...

  7. P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产

    https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...

  8. hdu 6092 Rikka with Subset(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092 #include <cstdio> #include <iostream> ...

  9. codeforces Educational Codeforces Round 24 (A~F)

    题目链接:http://codeforces.com/contest/818 A. Diplomas and Certificates 题解:水题 #include <iostream> ...

  10. 牛客第五场多校 A gpa 分数规划(模板)

    链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 Kanade selected n courses in the university. The ...