【实验一】计算机是怎样工作的?
2013-05-13 16:08
281 查看
要求:
请使用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。这样循环,直到任务全被处理完。
请使用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。这样循环,直到任务全被处理完。
相关文章推荐
- 实验:计算机是怎样工作的?
- Linux操作系统实验一:计算机是怎样工作的
- 【Linux操作系统分析】实验一:计算机是怎样工作的
- 实验一:计算机是怎样工作的
- 深入理解Linux之计算机是怎样工作的?
- 【Linux操作系统分析】计算机是怎样工作的
- Linux实验:计算机是怎么工作的
- “Linux内核分析”实验报告(一)分析汇编代码理解计算机是如何工作的
- 【Linux操作系统分析】计算机是怎样工作的
- 企业怎样做好计算机应急响应工作
- 魏昊卿——《Linux内核分析》第一周作业:从分析简单的汇编代码了解计算机是怎样工作的
- 计算机是怎样工作的
- 【实验一】计算机是怎么工作的
- 计算机是怎样工作的
- 企业怎样做好计算机应急响应工作 推荐
- Linux操作系统分析之计算机是怎样工作的
- [Lab1]计算机是怎样工作的
- 计算机是怎样工作的
- 实验一:计算机是怎么工作的
- 计算机是怎样工作的