最近在看性能优化时,有些概念有点模糊,于是就翻起尘封多年的大学课本
要了解程序调用过程首先要了解下计算机的组成原理,所以嘛先看看下图喽,PS:以下图片都是从课本里辛辛苦苦扫描出来的
1.计算机组成
冯诺依曼计算机机构如上图1.1所示
运算器:进行算术和逻辑运算
控制器:控制和指挥整个运算过程
运算器和控制器合称为CPU。CPU通过数据总线与存储器和接口交换信息
存储器:存放程序指令及原始数据.
存储器由存储单元组成,每个存储单元称为 一个字节(1B) 一个字节8位,存放8位二进制信息。每个字节有一个编号,成为地址(码)
存储器分为:程序存储区、数据存储去、栈。
CPU中设有寄存器,与运算器和控制器直接相连,可以存放数据或者计算的中间结果,如图1.2所示,由于不通过地址总线所以寄存器的数据存储速度快,但是寄存器不能无限制增加,多了就影响速度,所以为了解决这个矛盾,在存储器中特别分出了一块区域,称为栈,如图1.3,栈的存储不需要计算地址,因为速度快,可以作为寄存器的补充。
CPU中寄存器有两类:通用寄存器和专用寄存器。它们可用来暂存指令、数据和地址。控制器包含的寄存器有指令寄存器(IR)和程序计数器(PC)。运算器部件中,寄存器有累加器(ACC)
2.子程序的调用解析
主程序在执行过程中执行子程序,称为子程序调用。
子程序调用相关概念:
入口地址:程序是一组指令,第一条指令的地址称为程序的入口地址。
中断和断口地址:一个程序在执行过程去执行另一个程序,称为中断,主程序中断时的下一条指令的地址称为主程序的断口地址。
保护现场和恢复现场:如果主程序中断时,有些寄存器还存放着中间结果,而子程序可能用占用这些寄存器,那么就要将主程序的中间结果放到其他地方比如堆栈暂存,把寄存器让给子程序,这个过程就是保护现场。等到子程序执行完毕,再将主程序的中间结果放回寄存器,这个过程叫恢复现场。
子程序调用过程:当主程序转去执行子程序时,首先将断口地址压入堆栈中保存,再将子程序的入口送入PC,进入子程序后,首先保存主程序现场,然后再执行子程序,子程序完成后,恢复主程序现场,然后将断口地址从栈顶送回给PC