Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57688
  • 博文数量: 24
  • 博客积分: 205
  • 博客等级: 入伍新兵
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-14 15:57
文章分类

全部博文(24)

文章存档

2013年(8)

2012年(16)

我的朋友

分类: LINUX

2013-05-16 18:16:26

姓名:韩康   学号:SA***183
一、
实验内容
   请使用Example的C代码分别生成.cpp,.s,.o和ELF可执行文件,并加装运行,分析.s汇编代码在CPU上的执行过程。
   Example的C代码如下:

点击(此处)折叠或打开

  1. int g(int x)
  2. {
  3.    return x+3;
  4. }
  5. int f(int x)
  6. {
  7.    return g(x);
  8. }
  9. int main(void)
  10. {
  11.    return f(8)+1;
  12. }
 通过实验解释单任务计算机是怎样工作的,并在此基础上讨论分析多任务计算机是怎样工作的。
二、实验报告
    
首先分析一下test.c文件生成可执行目标文件test的过程。这个翻译过程分为四个阶段,执行这四个阶段的程序:预处理器、编译器、汇编器和链接器(编译系统)。
    1.    
预处理

gcc –E test.c –o test.i

扩展源代码,插入所有用#include命令的指定的文件,并扩展多有用#define声明指定的宏。

     test.i的内容如下:
    

点击(此处)折叠或打开

  1. //test.i
  2. # 1 "test.c"
  3. # 1 ""
  4. # 1 ""
  5. # 1 "test.c"
  6. int g(int x)
  7. {
  8.    return x+3;
  9. }
  10. int f(int x)
  11. {
  12.    return g(x);
  13. }
  14. int main(void)
  15. {
  16.    return f(8)+1;
  17. }
    2.    编译

gcc –S test.i –o test.s 或 gcc –S test.c –o test.s

编译过程就是把预处理完的文件进行一系列词法分析语法分析语义分析优化后生成相应的汇编代码文件

将test.i翻译成test.s,它包含一个汇编语言程序,汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
    test.s的内容如下:

点击(此处)折叠或打开

  1. .file "test.c"
  2.         .text
  3. .globl g
  4.         .type g, @function
  5. g:
  6.         pushl %ebp
  7.         movl %esp, %ebp
  8.         movl 8(%ebp), %eax
  9.         addl $3, %eax
  10.         popl %ebp
  11.         ret
  12.         .size g, .-g
  13. .globl f
  14.         .type f, @function
  15. f:
  16.         pushl %ebp
  17.         movl %esp, %ebp
  18.         subl $4, %esp
  19.         movl 8(%ebp), %eax
  20.         movl %eax, (%esp)
  21.         call g
  22.         leave
  23.         ret
  24.         .size f, .-f
  25. .globl main
  26.         .type main, @function
  27. main:
  28.         pushl %ebp
  29.         movl %esp, %ebp
  30.         subl $4, %esp
  31.         movl $8, (%esp)
  32.         call f
  33.         addl $1, %eax
  34.         leave
  35.         ret
  36.         .size main, .-main
  37.         .ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
  38.         .section .note.GNU-stack,"",@progbits
    3.    汇编

as test.s –o test.o 或 gcc –c test.s –o test.o 或gcc –c test.c –o test.o

汇编器将test.s翻译成机器语言指令(字节编码),打包成可重定位的目标文件test.o,它是一个二进制目标文件。

    4.    链接
     将目标代码文件与实现库函数的代码合并,并产生最终的可执行代码文件test

     最后生成四个文件:test.i    test.s     test.o    test
    下面分析test.s汇编代码在CPU上的具体实现过程:
   

三、问题探讨

1、单任务计算机是如何工作的

   单任务计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存贮器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去,直至遇到停止指令。

 程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是单任务计算机最基本的工作原理。

2、多任务计算机是如何工作的

    多任务处理是指计算机同时运行多个程序的能力。多任务的一般方法是运行第一个程序的一段代码,保存工作环境;再运行第二个程序的一段代码,保存环境;……恢复第一个程序的工作环境,执行第一个程序的下一段代码……现代的多任务,每个程序的时间分配相对平均。

    多任务,简单说,就是同一时间给多个程序运行处理数据。Unix是实时的、分布式系统,采用时间片方式,轮流给多个提交CPU处理请求的进程分配资源,支持多用户、多任务处理。Windows多任务处理采用的是虚拟机技术,在内存中创建逻辑微机(也是通过时间片轮流占用CPU),由它来运行处理程序。所谓多任务处理,就是指同时运行多个程序并且程序之间可以随意切换。



阅读(885) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~