linux_编译执行程序,分析计算机的工作原理
From: USTC_SA6196
实验:请使用Example的c代码分别生成.cpp,.s,.o和ELF可执行文件,并加载运行,分析.s汇编代码 在CPU上的执行过程
实验报告要求:通过实验解释单任务计算机是怎样工作的,并在此基础上讨论分析多任务计算机是怎样工作的。
---------------------------------------------------------------------------------------------------------------------------------------------------
1.实验程序:
2.对example.c文件进行编译,汇编等生成 .cpp .s .o 和可执行文件ELF example ,如下图:
3.查看程序的汇编代码,进行分析:
上面 步骤已经生成example.s文件,用 vi查看其汇编代码。
编辑 命令: vi example.s 生成汇编代码如下图所示:
4.分析其中汇编代码:
分析 :
程序运行时,从main函数开始,此时系统给main函数分配堆栈,main函数开始执行,将其ebp压入堆栈,同时esp也压入堆栈;
此时的汇编代码为:pushl %ebp movl %esp %ebp
堆栈内存变化为:
程序继续执行,要在堆栈中压入数据,此时为其分配空间,esp指针发生变化,然后压入数据。
此时的汇编代码为: sub1 $4 esp movl $8 (%esp)
堆栈内存变化为:
此时调用函数 f ,call f ,执行函数f, 压入ebp (pushl %ebp)和 esp (movl %esp %ebp) 内存变化如下:
f执行时,要使用数据,此时分配堆栈空间 esp 变化(subl $4 %esp),空间分配好后,去取堆栈中存在的数据(movl 8(%ebp) %eax)放入寄存器eax中
此时内存变化为:
将数据放入分配好的空间(movl %eax (%esp))
程序继续执行调用g函数(call g),执行g函数过程,分别压入 ebp 和 esp (pushl %ebp movl %esp %ebp)
堆栈内存变化为:
继续执行,取出堆栈数据 (movl 8(%ebp) %eax)放入寄存器eax中,再向eax中的数据加3 (addl $3 %eax)
当g函数执行完 popl %ebp 和 ret 时 内存变化为:
函数f执行 leave 和 ret 后 内存变化为:
main执行 addl $1 %eax 后 eax值增加,继续执行leave 和 ret 堆栈清空。函数执行完毕,此时寄存器eax中的值为12。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分析:单任务计算机的工作原理
根据冯诺依曼计算机原理,我们可知,最简单的计算机应该有处理器和存储器由总线连接而成。处理器主要对进程进行控制,存储器则存储程序。
单任务计算机的执行主要是要知道一条程序执行完毕后,下一条要执行那个程序或进程。处理器中有EIP指针,专门指向下一条程序的地址,整个程序在执行过程中就是通过EIP有序的执行每一条指令。在执行特定进程程序时,具体的过程就如上面分析那样,通过ebp esp 等指针和 eax edx ecx等寄存器来完成整个程序的运行过程。
对于多任务计算机的运行,就需要有进程的调度和中断机制来实现多进程共享处理器;
简单的想法是设置一个时间片,每个时钟周期,或者多个时钟周期后进行进程切换,这时处理器发出中断请求,当一条进程执行完毕后,保存现场,进入中断,转而执行其他进行,当其执行完毕后,恢复现场,继续程序。这种分时的共享处理器来完成进程的执行是多任务计算机执行的一种机制。