实验一:计算机是怎样工作的?
♦ 实验:请使用Example的c代码分别生成.cpp,.s,.o
和ELF可执行文件,并加载运行,分析.s汇编代码
在CPU上的执行过程
♦ 实验报告要求:通过实验解释单任务计算机是怎
样工作的,并在此基础上讨论分析多任务计算机
是怎样工作的。
一.实验过程
1. 预处理得到.cpp文件
2. 得到.s汇编文件
3. 得到.o目标文件
4. 得到可执行文件
二.实验分析
通过汇编文件内容,分析计算机的工作流程,.s文件的内容为:
.file "example.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 $3, %eax
popl %ebp
.cfi_def_cfa 4, 4
.cfi_restore 5
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 $8, (%esp)
call f
addl $1, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE2:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
从main函数开始执行,esp下移,将ebp入栈;将ebp移到esp所在位置;esp下移4字节;将8入栈;调用函数f(),将eip入栈,并把f的地址放入eip中;如图中橘色所示。
f()函数中esp下移,ebp入栈;将ebp移到esp所在位置;esp下移4字节;将ebp上面8字节处的内容放入eax中;再将eax中的值入栈;调用函数g(),将eip入栈,并把g的地址放入eip;如下图枚红色所示。
g()函数中esp下移,ebp入栈;将ebp移到esp位置;将ebp上面8字节处的内容放入eax;对eax中数值加3;如下图蓝色所示。
函数g()中ebp重新指向ebp2的位置,如下图红色所示:
函数g()返回到f(),将f()下一条指令放入eip中,esp指向ebp2的位置,如下图红色所示:
函数f()中ebp出栈,使得ebp指向ebp1的位置,如下图红色所示:
函数f()返回到main()函数中,将main函数的下一条指令放入eip中,在main()中,将eax中的值加1,如下图红色所示:
Main()函数中将esp指向ebp1所在位置,如下图红色所示:
最后main()函数结束,ebp出栈,将ebp0地址放入eip中,执行结束,如下图红色所示:
三.实验总结
单任务计算机工作方式:程序按顺序执行,由eip指出下一条指令的地址。其中jmp、call和ret指令可以实现执行过程中的跳转。
多任务计算机工作方式:多任务计算机通过中断机制,采用时间片轮转等方式进行任务调度,实现多任务的处理。