【实验一】计算机是怎样工作的?

来源:互联网 发布:培训出来的程序员 编辑:程序博客网 时间:2024/04/30 03:26

要求:
  • 请使用Example的c代码分别生成.cpp,.s,.o和ELF可执行文件,并加载运行,分析.s汇编代码在CPU上的执行过程
  • 实验报告要求:通过实验解释单任务计算机是怎样工作的,并在此基础上讨论分析多任务计算机是怎样工作的。
  • 实验报告以博客URL方式提交,提交地址 实验一提交入口

一、生成所需文件

源文件如下:


源文件为lab1.c,调用gcc -c lab1.c 生成.o文件(如图)

调用gcc -S lab1.c 生成.s文件(如图)

调用gcc -E -o lab1.cpp lab1.c生成.cpp文件(如图)

gcc -o lab1 lab1.c

                                                    

         图一 生成的.s/.cpp/可执行文件/.o

总结gcc -c生成.o

-S生成.S

-E生成.cpp

-o生成可执行

二、具体执行过程

    lab1.s文件如下:

.file "lab1.c"

.text

.globl g

.type g, @function

g: ;函数g

.LFB0:

.cfi_startproc

pushl %ebp ;ebp压栈

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

movl %esp, %ebp ;esp赋值给ebp

.cfi_def_cfa_register 5

movl 8(%ebp), %eax ;ebp偏移8的位置中的内容放入eax

addl $3, %eax ;eax寄存器加3后

popl %ebp ;弹出的值赋给ebp

.cfi_restore 5

.cfi_def_cfa 4, 4

ret ;返回,即把pop %eip

.cfi_endproc

.LFE0:

.size g, .-g

.globl f

.type f, @function

f: ;函数g

.LFB1:

.cfi_startproc

pushl %ebp ;ebp压栈

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

movl %esp, %ebp ;esp赋值给ebp

.cfi_def_cfa_register 5

subl $4, %esp ;esp减4后

movl 8(%ebp), %eax ;ebp偏移8的位置中的内容放入eax

movl %eax, (%esp) ;eax中的内容赋值给esp所指位置

call g ;调用函数g

leave ;恢复现场

.cfi_restore 5

.cfi_def_cfa 4, 4

ret ;返回

.cfi_endproc

.LFE1:

.size f, .-f

.globl main

.type main, @function

main: ;函数main

.LFB2:

.cfi_startproc

pushl %ebp

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

movl %esp, %ebp ;esp赋值给ebp

.cfi_def_cfa_register 5

subl $4, %esp

movl $8, (%esp);将8放入esp所指单元

call f ;调用f函数

addl $1, %eax ;eax寄存器加一

leave ;恢复调用函数前的现场

.cfi_restore 5

.cfi_def_cfa 4, 4

ret 返回

.cfi_endproc

.LFE2:

.size main, .-main

.ident "GCC: (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2"

.section .note.GNU-stack,"",@progbits

解析:故此汇编代码在计算机上的执行过程如下:执行main函数,先保存当前栈基地址,然后执行具体代码,当执行到调用函数f,先把参数存入栈中,然后跳转到f函数相应代码,先把当前栈基地址保存,然后继续执行f代码,当执行到g时,依次类推。执行完函数g,返回调用点,继续执行f代码。然后返回main函数,继续执行,直到程序结束,栈恢复成未执行程序lab1之前的状态。


堆栈变化如图:


图二


图三


图四


图五


图六

图七

图八

图九

三、单任务计算机的工作工程

当任务的程序代码放入内存时,CPU一条语句一条语句的执行,执行函数时,如遇到调用函数,则通过栈先把当前环境保存,再执行调用函数,新函数对应一个逻辑上的新栈。依次类推,直到程序执行完。任务完成。

四、多任务计算机的工作过程

多任务计算机将多个任务分时执行,通过CPU时间片轮转,分给每个任务特定的时间。执行任务1时,和单任务计算机的工作工程一样。当执行任务1的时间片到了时,保存当前环境,然后CPU转而执行任务2。这样循环,直到任务全被处理完。



原创粉丝点击