万子惠 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

实验部分(反汇编简单的C程序)

代码:

int g(int x)
{
return x + 6;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(4) + 8;
}

最后结果应为18

  1. 在Code下新建main.c

  1. 进行编译和反编译

  1. 反编译结果如下

清理完后*这里vim推荐使用dd(删除整行)

(清理掉.开头的部分)

那么接下来我们开始分析了,这里我们先准备好环境如图

和视频里一样我们简化地址值(本应该是一个向下增长,地址逐渐减小的值)

首先看从main函数开始看:

1.将ebp的值入栈,入栈有两个效果,一是esp向下一位增长一位,然后是在现在的esp上存入ebp的值(当前为0)。

2.将esp的值赋给ebp,就是把ebp移到和esp相同位置。

3.将esp向下移4

4.在esp的位置上存上4

call f=>存储call的下一条指令位置(addl) ,然后跳转到f所在的位置

6.esp向下移动一格并存入ebp当前的值(1)

7.将ebp移到esp当前的位置

8.esp向下移动一格

9.将edp上上在走两格的数据放入eax

10.将eax的值存到esp的位置上

  1. call g=>存储call的下一条指令位置(ret) ,然后跳转到g所在的位置

12.ebp(4)的值入栈

13.将ebp移到esp的位置

14.将当前ebp的前两个位置的值(4)赋给eax

15.将当前esp的值(4)赋给ebp, esp向上移动一格

16.返程咯,出栈,ebp回到上一个被记录的位置,esp上移

ret=popl %eip

18.回到15行

leave:movl %ebp,%esp
popl %ebp

ret=popl %eip

20.回到23行,eax加8

22.ret,eip回到之前的堆栈

最后的返回值为18

总结部分

part1

学习到汇编语言的基本知识,以及一些名词的意思。

API:程序员与计算机的 接口界面
ABI:二进制接口
cs:eip :用来准确定位指令

几种计算指令:[b,w,l,q:8位,16位,32位,64位]

movl %eax,%edx 寄存器寻址
movl $0x123,%edx 立即数寻址
movl 0x123,%edx 直接寻址
movl (%edx),%edx 间接寻址
movl 4(%edx),%edx 变址寻址(edx=*(int 32_t*)(edx+4)) pushl %eax =>sub $4,%esp
movl %eax,(%esp)
popl %eax =>movl(%esp),%eax
movl $4,%esp
call X (保存当前的eip并读取下条为新eip)
ret =>popl %eip enter =>push %ebp (创建新空栈)
=>movl %esp,%ebp leave =>movl %ebp,%esp (撤销函数调用堆栈)
=>popl %ebp
ret:pop eip

堆栈调用特性:向下伸长,向上还原

part2我对计算机如何工作的理解

总体来讲,我觉得用冯诺依曼的模型来描述计算机的工作过程是很精到的。

(特别是对汇编代码进行了一步一步的分析之后,就更能深入体会到这种过程。)

我觉得老师视频里边的那个图更好说明这种方式

在我来用文字说明的话,计算机就是通过cpu的运行经过总线调用内存中数据存储的部分一条一条的按照顺序执行不停地进行存储修改等变化操作,使得我们得到自己想要得到的效果以及存储内容。

part3 学习感受

视频都裁剪得很短,看起来很有快感啊。之前学习过有关汇编的知识但都忘得差不多了,在这个视频多多少少补全了回来,感觉不错。计算机的脑子是很死很顺溜的,所以为了实现强大的功能,它的基本的汇编语言的确就是繁琐的,不算绕。希望在这里能打好基础,往后的学习能更加轻松些。

LInux内核分析——计算机是如何工作的进行的更多相关文章

  1. linux内核分析--计算机是如何工作的

    实验部分 使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码. 源代码如下: int g(int x) { return x + 9; } int f(int x) ...

  2. Linux内核分析— —计算机是如何工作的(20135213林涵锦)

    实验部分 (以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码, int g(i ...

  3. Linux内核分析——计算机是如何工作的

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ( ...

  4. Linux内核分析 计算机是如何工作的——by王玥

    1.冯诺依曼体系结构:也就是指存储程序计算机 硬件(存储程序计算机工作模式): 软件(程序员角度): 2.API:程序员与计算机的接口界面 ABI:程序与CPU的接口界面 3.X86的实现: 4.X8 ...

  5. Linux内核分析——操作系统是如何工作的

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析> 实验部分 使用实验楼的虚拟机打开shell 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain. ...

  6. Linux内核分析— —操作系统是如何工作的(20135213林涵锦)

    mykernel实验指导(操作系统是如何工作的) 实验要求 运行并分析一个精简的操作系统内核,理解操作系统是如何工作的 使用实验楼的虚拟机打开shell cd LinuxKernel/linux-3. ...

  7. linux内核分析--操作系统是如何工作的?

    一个简单的时间片轮转多道程序 操作系统的"两把剑":中断上下文(保存现场和恢复现场)和进程上下文的切换 源代码的分析 *使用的源代码为视频中所使用的精简内核的源代码 首先分析myp ...

  8. Linux内核分析--操作系统是如何工作的

    “平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 一.初 ...

  9. 20135239益西拉姆 Linux内核分析 操作系统是怎样工作的?

    益西拉姆+ 原创作品+ <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 堆栈 堆栈是C语言程序运行时 ...

随机推荐

  1. 查看占用cpu和内存最多的进程

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -;ps aux|grep -v PID|sort -rn -k +|head linux下获取占用内存 ...

  2. WordPress搬家教程:换空间与换域名

    WordPress搬家教程:换空间与换域名 由于本人博客空间8月份已到期,便新购一个虚拟主机想进行WordPress搬家,于是特意在网上查了些WordPress搬家教程,进行了综合总结,并结合这次实操 ...

  3. Android:Butter Knife 8.0.1配置

    github地址:https://github.com/GarsonZhang/butterknife Butter Knife Field and method binding for Androi ...

  4. XML学习笔记(三) -- Schema

    标签(空格分隔): 学习笔记 Schema的格式 XML Schema文档是由元素.属性.命名空间和XML文档中的其他节点构成的. XML Schema有两种重要的Schema模型:Microsoft ...

  5. sqlite创建表

    create table bike (id ) primary key, password ));

  6. Sprint(第三天11.16)

    Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:点餐系统 4.团队博客地址:http://www.cnblogs.com/iamCarson/ 团 ...

  7. AngularJS 特性—SinglePage、template、Controller

    单页Web应用(SinglePage) 顾名思义,只使用一个页面的Web应用程序.单页面应用是指用户通过浏览器加载独立的HTML页面,Ajax加载数据页面无刷新,实现操作各种操作. 模板(templa ...

  8. Java:描述反射机制的作用?举几个反射的应用?

    比较全的解释了:JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方 ...

  9. JsTree

    一.JStree的简单介绍 1.关于jstree jsTree 使用了 jQuery 和 Sarissa,是一个是免费的但是设置灵活的,基于 JavaScript 跨浏览器支持的网页树形部件. jsT ...

  10. 实体类调用泛型父类中的静态方法中执行CRUD——第二版

    using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespa ...