张文俊 + 原创作品转载请注明出处 + 《Linux 内核分析》 MOOC 课程

实验要求:

1、总结部分要求阐明自己对“计算机是如何工作的”理解;

2、博客中需要使用实验截图;

实验内容:

1、阐述计算机是如何工作的;

2、分析汇编代码的工作过程中堆栈的变化;

一、冯诺依曼体系结构

冯诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。

根据冯·诺依曼体系结构构成的计算机,必须具有如下功能:

把需要的程序和数据送至计算机中。

必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。

能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。

能够根据需要控制程序走向,并能根据指令控制机冯· 诺依曼体系结构器的各部件协调操作。

能够按照要求将处理结果输出给用户。

冯诺依曼体系结构有以下三条特点:

(1)计算机处理的数据和指令一律用二进制数表示。

(2)顺序执行程序。

(3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

二、实验代码

源C代码如下:
int g(int x)

{

return x + 5;

}

int f(int x)

{

return g(x);

}

int main(void)

{

return f(21) + 5;

}
通过实验楼的已搭建好的 64 位 Linux 虚拟机环境,采用如下命令编译汇编代码:

gcc -S -o main.s main.c -m32

其中,-S表示生成为汇编代码;

-m32表示生成的汇编程序是32位的;

汇编程序后缀为.s

使用上条命令汇编出的main.s文件代码如下:

    .file    "main.c"
.text
.globl g
.type g, @function
g:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl 8(%ebp), %eax
addl $5, %eax
popl %ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size g, .-g
.globl f
.type f, @function
f:
.LFB1:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE1:
.size f, .-f
.globl main
.type main, @function
main:
.LFB2:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $4, %esp
movl $21, (%esp)
call f
addl $5, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE2:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits

其中,实际被程序执行的代码如下:

g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $5, %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 $21, (%esp)
call f
addl $5, %eax
leave
ret

三、汇编代码分析

首先从 main 函数开始:

pushl   %ebp
movl %esp, %ebp

表示将基底指针压栈,然后把栈顶指针的值赋给基底指针。

subl    $4, %esp
movl $21, (%esp)

由于栈是由高地址向低地址扩展,在 32 位操作系统系统上,每个栈元素为 4 个字节,所以栈顶指针减 4表示栈顶指针减了一个单位(即向下拓展一个单位);

同时,采用立即数寻址的方式,把21 存入栈顶指针所指向的位置。

call f

call 指令调用函数 f 执行,

call指令,相当于pushl %eip movl $f, %eip

即:首先将当前 %eip 的值压栈保存,然后将f地址赋给eip。

函数 f 类似于main函数,f继续调用g函数。在g函数中,eax的值要增加5 ,然后 popl 出栈返回到先前函数 f 中 call 指令保存执行指令地址。

addl    $5, %eax
popl %ebp

函数g返回后,函数 f 的下一条指令 leave 相当于:

movl  %ebp, %esp
popl %ebp

它将函数堆栈恢复到当前函数被调用前的状态。

然后执行ret指令,函数返回。

函数 f 返回后,函数 main 的下一条指令将 eax中的值加5,然后再leave恢复堆栈状态,ret返回。

四、总结

计算机的基本工作原理是美籍匈牙利科学家冯`诺依曼于1946年首先提出来的。

其核心是存储程序与控制,即计算机能够自动的完成运算或处理过程的基础是存储程序和程序控制。

计算机之所以能自动,正确的按人们的意图工作,是由于人们事先已把计算机如何工作的程序和原始数据通过输入设备送到计算机的存储器中。

当计算机执行时,控制器就把这些指令一条接一条地从存储器中取出来,加以翻译,并按指令的要求进行相应的操作,直到遇到停止指令或发生计算机无法继续运行的情况为止。

程序中的每一条指令都要求计算机完成一定的操作。一条指令通常由两个部分组成,即地址码(操作码)和操作数。

因为计算机只能识别二进制数,所以每条指令都用二进制编码表示,但直接用二进制编码书写指令不方便,因此常用十六进制形式表示。

五、实验截图

“Linux内核分析”实验一报告的更多相关文章

  1. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  2. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  3. 【MOOC EXP】Linux内核分析实验六报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...

  4. “Linux内核分析”实验二报告

    张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内 ...

  5. “Linux内核分析”实验三报告

    构造一个简单的Linux系统 张文俊+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000290 ...

  6. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  7. 【MOOC EXP】Linux内核分析实验二报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [操作系统是如何工作的]   教学内 ...

  8. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...

  9. 【MOOC EXP】Linux内核分析实验四报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [使用库函数API和C代码中嵌入汇编代 ...

随机推荐

  1. linux下的“定时器”:crontab

    1.概述 crontab是用来设置在固定时间点或时间间隔执行某条指令,类似于时程表.使用-u user是指定user用户的时程表. 2.参数 -e[UserName] :调出编辑器,编辑定时任务,打开 ...

  2. Python csv.md

    csv csv模块可以用于处理从电子表格和数据库导出的数据到带有字段和记录格式的文本文件,通常称为逗号分隔值(csv)格式,因为逗号通常用于分隔记录中的字段. Reading csv.reader(c ...

  3. SDOI 2018 R2 游记

    一篇真正的“游记”. DAY -3 下午: 今天老师批准了我去省选划水的请假要求. 批准之后感觉学习非常有动力,顺便忽悠别的同学和我一起去,然而wzx是唯一一个表示可以考虑一下的同学,其他同学直接一口 ...

  4. 20165302Exp0 Kali安装 Week1

    一,下载 下载网址https://www.kali.org/downloads/ 二,安装(安装过程中有一部分没有截图,因此没有贴上) 创建虚拟机 选择Linux,版本Ubuntu 一直下一步,最后点 ...

  5. 理解传说中的roll、yaw、pitch

    三维中 Yaw, pitch and roll 的区分(图片)                    yaw 航偏                                         pi ...

  6. 信号处理开源库SP++介绍

    SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源 C++程序库,该库提供了信号处理与数值计算中常用算法的 C++实现.SP++中所有算法都以 C++类 ...

  7. C#中的委托(二)

    一.Action<T>和Func<T>委托 除了上篇描述的为每个参数和返回类型定义一个新委托类型之外,还可以使用Action<T>和Func<T>委托. ...

  8. $\rm{NOIP}$前的模拟题整理·菜鸡互啄篇

    嗯,打算整理一下我们机房菜鸡互啄中比较不错的题-- 大概情况就是每个人出三道题,然后互测这种感觉-- 至于某些Y姓基佬.Z姓基佬偷偷出原题--就不说了233 嗯,剩下的就先\(magpie\)着吧23 ...

  9. 微信小程序开发 [07] 写在后面的话

    写在后面的话基本算是吐槽了,在学完小程序的课程之后,我用博客园的api,写了个闪存的小程序,本来兴致勃勃甚至这篇是准备写"我的第一个小程序发布啦",然而并没有. 不是说我偷懒了没写 ...

  10. ORACLE SEQUENCE 具体解释

    1.    About Sequences(关于序列) 序列是数据库对象一种. 多个用户能够通过序列生成连续的数字以此来实现主键字段的自己主动.唯一增长,而且一个序列可为多列.多表同一时候使用. 序列 ...