1. gcc的编译过程
(1)gcc的编译流程包括:
*预处理 (Pre-Processing) : 编译选项 -E , 生成文件后缀 .i
*编译 (Compiling) : 编译选项 -S , 生成文件后缀 .s
*汇编 (Assembling) : 编译选项 -c , 生成文件后缀 .o
*链接 (Linking)
(2)汇编代码分析
c源程序:
int g (int x)
{
return x + 3;
}
int f (int x)
{
return g(x);
}
int main ()
{
return f(8) + 1;
}
对应汇编代码:
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp),%eax //通过ebp访问传进来的参数,放入eax
addl $3,%eax //eax加3
popl %ebp //恢复原来的栈框架
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4,%esp //esp下移,预留空间
movl 8(%ebp),%eax //通过栈框架指针ebp,将f的参数放入eax
movl %eax,(%esp) //将eax的值作为调用函数g的参数
call g //调用函数g
leave //函数返回前的准备工作
ret
main:
pushl %ebp //栈框架指针压栈,方便函数返回时,恢复原来的栈框架
movl %esp, %ebp //让ebp指向新的栈框架
subl $4,%esp //栈指针esp下移四个字节,为新的数据预留空
movl $8,(%esp) //给函数f穿参数8,放入刚才预留的空间
callf //函数调用
addl $1, %eax //eax中保存了调用函数f的返回结果,结果加1
leave //函数返回前的准备工作
ret
2. 单任务计算机与多任务计算机的工作方式对比
单任务:内存当中只有一个程序,当这个程序因为请求某些资源而被迫中断时,
cpu进入空闲状态,即使外存中还有其他的程序也不能运行
多任务:内存中有多个程序存在,当当前程序发生中断时,通过调度程序,可以
切换到其他准备好的程序上运行,这样提高了cpu的利用率