什么是子程序?
子程序是其他程序用来完成特定任务的程序。可以从微程序主体内的任何点调用子程序。通常,许多微程序包含相同的代码段。可以通过使用使用微代码公共部分的子程序来保存微指令。
例如,为指令生成操作数的有效地址所需的微操作序列对所有内存引用指令都是通用的。该序列可以是从许多其他例程中调用以执行有效地址计算的子例程。
使用子程序的微程序必须有在子程序调用期间存储返回地址和在子程序返回期间恢复地址的规定。这可以通过将来自控制地址寄存器的递增输出放入子程序寄存器并分支到子程序的开头来实现。
然后子程序寄存器可以成为传输地址以返回到主程序的源。构造存储子程序地址的寄存器文件的最佳方法是在后进先出(LIFO)堆栈中组织寄存器。
将程序控制转移到子程序的指令有不同的名称。最常用的名称称为子程序、跳转到子程序、分支到子程序或分支并保存地址。
调用子程序指令由操作代码和指定子程序开始的地址组成。
该指令通过执行以下两个操作来执行-
程序计数器中可用的下一条指令的地址(返回地址)存储在一个临时位置,因此子程序知道从哪里返回。
控制转移到子程序的开头。每个子程序的最后一条指令通常称为从子程序返回,将返回地址从临时位置传送到程序计数器中。这导致将程序控制转移到其地址最初存储在临时位置的指令。
子程序调用通过以下微操作实现-
如果当前子程序调用另一个子程序,则新的返回地址被压入堆栈,依此类推。从最后一个子程序返回的指令由微操作实现-
通过使用子程序堆栈,所有返回地址都由硬件自动存储在一个单元中。程序员不必关心或记住返回地址的存储位置。
递归子程序是调用自身的子程序。如果只有一个寄存器或内存位置可以保存返回地址,并且递归子程序调用自身,则结束前一个返回地址。
这是不可取的,因为重要信息被破坏了。如果子程序的每次使用都采用不同的存储位置,而另一个较轻级别的使用仍处于活动状态,则可以解决此问题。
当使用堆栈时,每个返回地址都可以被压入堆栈而不会破坏任何先前的值。这解决了递归子程序的问题,因为下一个要退出的子程序总是最后一个被调用的子程序。