网站视频下载方法,免费做网站有哪些家,廊坊哪里做网站好,做ppt好的网站引入
Question#xff1a; 为什么函数的返回值能在函数的外部被拿到呢#xff1f;局部变量不是出了作用域就要被销毁嘛#xff1f;
#includestdio.hint Add(int a, int b)
{int ret a b;return ret;
}
int main()
{int a 10, b 20;int ret Add(a, b);return …引入
Question 为什么函数的返回值能在函数的外部被拿到呢局部变量不是出了作用域就要被销毁嘛
#includestdio.hint Add(int a, int b)
{int ret a b;return ret;
}
int main()
{int a 10, b 20;int ret Add(a, b);return 0;
}我们观察函数返回时的汇编代码就能看出端倪了 可以看到最后在返回 Add 函数的返回值时是讲返回值写到了寄存器 中在 main 函数的中想要拿到 Add 函数的返回值只需要将 j 寄存器中的内容拷贝到 ret 变量中就行了
进程切换
为啥要讲怎么获取函数的返回值呢 我想说明在 CPU 的内部有很多很多的寄存器
通用寄存器eaxebxecxedx 等等这些寄存器就是用来临时保存函数的返回值将内存中的数据拷贝到 CPU 中参与算术或者逻辑运算等等。程序计数器(PC)对应的寄存器是eip这个寄存器用来保存 CPU 正在执行的指令的吓一跳指令的地址。通过这个寄存器我们就知道进程的代码执行到那个位置了ebpesp这两个寄存器大家都还有印象吧就是用来维护栈桢结构的那两个寄存器status这是个状态寄存器。
大家不用管这些我们只要知道在 CPU 内部有很多寄存器就行了 显然CPU 中的寄存器保存的是进程相关的数据你想想一个进程的时间片消耗完毕了在被切换的时候CPU 中的寄存器中保存的临时数据要不要给进程带走呢当然是要啦不带走这个进程下次在 CPU 上执行的时候怎么知道从哪里继续执行呢 其中 CPU 中保存的进程的临时数据称为进程的上下文。 因此在进程切换的时候势必会有两个动作
保存进程的上下文。恢复进程的上下文。(保存进程上下文的目的不就是为了恢复嘛) 那么问题就来了进程的上下文保存道哪里呢 我只能说进程的上下文是保存在 task_struct 中的这个完全有能力做到 我只要在 task_struct 中定义一个结构体保存每个寄存器的信息就行了 struct reg_info
{//假设系统是 32 位的int eax;int ebx;int eip;int esp;int ebp;//等等等等
};定义一个结构体在 task_struct 中保存一个 reg_info* 的字段就行了 但是进程的上下文保存在 task_struct 中的说法不完全正确 如果你想深入了解可以搜一搜全局段描述符局部段描述符的概念