张文俊 + 原创作品转载请注明出处 + 《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文件代码如下:

  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. subl $4, %esp
  33. movl 8(%ebp), %eax
  34. movl %eax, (%esp)
  35. call g
  36. leave
  37. .cfi_restore 5
  38. .cfi_def_cfa 4, 4
  39. ret
  40. .cfi_endproc
  41. .LFE1:
  42. .size f, .-f
  43. .globl main
  44. .type main, @function
  45. main:
  46. .LFB2:
  47. .cfi_startproc
  48. pushl %ebp
  49. .cfi_def_cfa_offset 8
  50. .cfi_offset 5, -8
  51. movl %esp, %ebp
  52. .cfi_def_cfa_register 5
  53. subl $4, %esp
  54. movl $21, (%esp)
  55. call f
  56. addl $5, %eax
  57. leave
  58. .cfi_restore 5
  59. .cfi_def_cfa 4, 4
  60. ret
  61. .cfi_endproc
  62. .LFE2:
  63. .size main, .-main
  64. .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
  65. .section .note.GNU-stack,"",@progbits

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

  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. subl $4, %esp
  12. movl 8(%ebp), %eax
  13. movl %eax, (%esp)
  14. call g
  15. leave
  16. ret
  17. main:
  18. pushl %ebp
  19. movl %esp, %ebp
  20. subl $4, %esp
  21. movl $21, (%esp)
  22. call f
  23. addl $5, %eax
  24. leave
  25. ret

三、汇编代码分析

首先从 main 函数开始:

  1. pushl %ebp
  2. movl %esp, %ebp

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

  1. subl $4, %esp
  2. 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 指令保存执行指令地址。

  1. addl $5, %eax
  2. popl %ebp

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

  1. movl %ebp, %esp
  2. 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. 3、爬虫之selenium模块

    一 selenium模块 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. selenium最初是一个自动化测试工具, ...

  2. C++虚函数再复习

  3. Kafka学习之路 (五)Kafka在zookeeper中的存储

    一.Kafka在zookeeper中存储结构图 二.分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...

  4. [luogu2469] 星际竞速

    题面 ​ 巨佬一眼就能看出这是最小路径覆盖, 我这个蒟蒻还是太弱了... ​ 我们可以知道跳跃值为点权w[i], 两点之间距离为边权ww ​ 对于每个点, 在最小路径覆盖问题中, 假设每个点都是一条路 ...

  5. Lr原理初识-hc课堂笔记

    showslow web服务器-apache.ngix devops 需求调研-占1/3的时间. 架构拓扑图 APP端测试工具:JT.Vtest 进程是管理单元.线程是执行单元. 虚拟用户和真实用户是 ...

  6. nginx静态文件缓存的解决方案

    nginx的一大功能就是完成静态资源的分离部署,减轻后端服务器的压力,如果给这些静态资源再加一级nginx的缓存,可以进一步提升访问效率. 第一步:添加nginx.conf的http级别的缓存配置 # ...

  7. css 字体、文本、padding的样式

    一.字体的样式: 1)字体倾斜:font-style:italic 2)字体大小:font-size 一般为偶数. 3)行高:line-height   当行高为奇数的时候,是文字上面比文字下面的少一 ...

  8. 关于css浮动的一点思考

    浮动到底是什么? 浮动核心就一句话:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素.请默念3次! 浮动最初设计的目的并没那么多事儿,就只是用来实现文字环绕效果而已,如下所示: ...

  9. Jquery的Ajax中contentType和dataType的区别(转载)

    上代码 $.ajax({ type: httpMethod, cache: false, contentType: "application/json; charset=utf-8" ...

  10. ccf201703-2学生排队

    问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. ...