4、堆栈寻址
堆栈寻址方式的地址是隐含的,在指令中不必给出操作数的地址,因此,指令的长度很短,一般的形式有:
OPC
OPC M
前一种是标准的采用堆栈寻址方式的指令,参加运算所需要的操作数从堆栈顶端弹出,如果需要两个或多个操作数,则依次从堆栈顶端弹出,运算结果压入堆栈顶端。后一种堆栈指令在RISC计算机中仅仅用来在栈顶与其他主存储器单元之间交换数据,在CISC计算机中也可以用于运算指令,指令所需要的一个操作数来自于主存储器,其它操作数从栈顶弹出,运算结果压入栈顶。
从60年代开始,出现了一批以堆栈寻址方式为主的堆栈计算机,这类计算机系统与上面提到的以寄存器寻址方式和主存寻址方式为主的计算机系统相比,在一定程度上缩小了高级语言与机器语言的差距,堆栈计算机具有如下特点:
(1)支持高级语言,有利与编译程序。因为一般的算术表达式可以很容易地转化成逆波兰表达式,而逆波兰表达式能够直接形成由堆栈指令组成的程序,这样就简化了编译程序。在指令系统这一节中,还要举例来分析。
以主存寻址方式为主的计算机系统,在编译一个算术表达式时,要为每一个变量分配主存单元,另外,还会人为地产生一些中间变量。如何减少中间变量的个数,合理地为变量分配存储单元,是编译器的一项许多相当困难的工作。
以寄存器寻址方式为主的计算机系统,编译器需要决定那些变量放在通用寄存器中,那些变量放在主存中,以减少访问主存储器的次数。另外,也同样存在如何减少了中间变量,节省了存储空间的问题。
(2)程序的总存储量最短。由于堆栈指令不需要地址码,指令的长度很短,与以寄存器寻址方式和以主存寻址方式为主的计算机系统相比,虽然程序本身的条数没有减少,但程序的总存储量要缩短许多。
(3)支持程序的嵌套和递归调用,支持中断处理。嵌套调用是指一个子程序又调用另一个子程序,递归调用是指一个子程序直接或经过别的子程序间接调用它本身,由此又可分为直接递归调用和间接递归调用。
在程序调用过程中,要保存返回地址,保存处理机状态,保存程序现场,并向子程序传送参数。在堆栈型计算机中,可以把这些信息都压入堆栈,而不必为它们赋予地址。当从子程序返回时,可以直接从堆栈中弹出所需要的信息。这样,可以减少大量的辅助操作,加快运算速度。
中断的处理过程与程序的调用很类似,使用堆栈能够加速中断的处理过程,简化中断程序设计。
堆栈型计算机的主要缺点是运算速度比较低,这是由于堆栈与处理机之间的信息传送量很大造成的。
实际上,对堆栈访问最频繁的堆栈顶部的几个单元。为了提高堆栈的工作速度,许多堆栈型计算机的栈顶部分设计成一个高速的寄存器堆。这样,访问堆栈就象访问寄存器一样快速。
目前,许多以寄存器寻址方式和主存寻址方式为主的计算机系统,也设置有堆栈,用以支持程序的嵌套和递归调用,支持中断处理。