计算机的工作原理

肖宝林   SA*****440

1、example.c的源代码


----------------------------------------------------------------------------------------------------------------------------------------

2、将Example的c代码编译成.cpp、.s、.o和ELF可执行文件

~$ gcc -E -o example.cpp example.c                                   编译成.cpp文件

~$ gcc -S -o example.s example.c                                       编译成.s文件

~$ gcc -x assembler -c example.s -o example.o                  编译成.o文件

~$ gcc -o example example.o                                              编译成可执行文件

经过以上4步,将会多出4个文件


----------------------------------------------------------------------------------------------------------------------------------------

3、我们来分析一下.s汇编文件在CPU上的执行过程

example.s文件的内容如下




程序从main函数开始执行,在执行这个程序前,帧指针(基址指针)ebp、栈顶指针esp在main函数栈的高地址处。



由上面的执行过程我们可以可到,在main函数执行,会先保存之前的ebp。调用函数f时,即开辟一个新的函数栈时,会保存之前的eip,即函数返回地址,以便调用函数结束时,返回到主调函数的下一句语句执行。再把调用的函数的入口地址赋给eip,来执行被调用的函数。

----------------------------------------------------------------------------------------------------------------------------------------

f调用函数f的过程,会将参数保存在eax寄存器中,并压入函数栈中。

接着,函数f调用g函数,同样将eip压入栈中,并将g函数的地址赋给eip。并将参数存放到eax寄存器,将eax中的内容加3,此时eax中的内容为11。最后,将ebp出栈,函数将依次返回。


各个函数出栈之后,栈中内容的变化如下。返回到主函数时,eax的值还会再加1,最终为12,即为main函数的返回值。


----------------------------------------------------------------------------------------------------------------------------------------

总结:

单任务计算机的工作原理:

每个函数都有自己的函数栈,主调函数调用被掉函数前,会保存eip的值,以便函数调用完成时返回主调函数会使用pop恢复保存在栈中的寄存器,继续执行下一条语句。调用函数时,将被调用函数的地址赋给eip,并且在新的函数栈中,将会保存旧的ebp,保存寄存器和局部变量,并且将运算结果存放在eax寄存器中。如果函数存在链式调用,那么旧的ebp逻辑上将会线性结构。

多任务计算机的工作原理:

相对于单任务的计算机,多任务的计算机要执行其他任务时,将会发出中断,即有中断机制。而且,会给任务分优先级,不同的任务可能拥有不同的优先级。还有,任务执行时有执行队列,以及调度算法来调度该执行哪个任务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值