程序是程序员实现程序结构化的一条有效途径。
首先让我们来看看支持子程序过程调用的最基本的操作:MIPS提供了一条指令jal(jump and link),它的功能是把紧位于jal下的指令地址保存到寄存器$31中,然后跳转到子程序,即跳转和链接。这时$31=PC+4, PC是指令jal的地址。
比如: jal Procedure Address
我们已经有一条指令jr(jump register)用于链接的.可以用它来执行跳回操作。
比如: jr $31
这也正是寄存器$31的通常用途所在。对于参数的保存,有两种方法:调用者保存和被调用者保存。现在约定:通常采用被调用者保存,并且$4,$5,$6,$7是专门用以保存参数的。
下面我们举例来说明:
假设程序A调用B,B又调用C,C不调用任何其他程序。在调用C之前,程序B必须将它自己的返回地址存储在寄存器$31中,并且把堆栈指针指向堆栈的新顶端。因此,C被调用,并且指令
jal 将寄存器$31改变为存储C的返回地址。在程序C返回到程序B之后,这个旧的返回值从寄存器$31中被重新存储,并且堆栈指针
还原。
根据上面的分析,我们可以写出该程序的主体代码:
(我们假定寄存器$29保有堆栈指针,并且$24指向当前堆栈的顶端)
A: ...
...
jal B # call B and save return address in $31
B: ...
... # now ready to call C
add $29,$29,$24 # adjust stack to make room for next item
sw $31,0($29) # save the return address
jal C # call C and save return address in $31
# return from C to next instruction
lw $31,0($29) # restore B's return address...
sub $29,$29,$24 # adjust stack to pop B's return address
...
...
jr $31 # return to routine that called B
C: ...
...
jr $31 # return to routine that called C
更多内容:
浙江大学ACM试题解答(四月)
http://blog.csdn.net/ctu_85/archive/2007/04/24/1576831.aspx
浙江大学ACM试题解答(三月)
http://blog.csdn.net/ctu_85/archive/2007/03/20/1535556.aspx
麻省理工算法导论翻译
http://blog.csdn.net/ctu_85/archive/2007/06/08/1643179.aspx
华容道游戏与算法
http://blog.csdn.net/ctu_85/archive/2007/05/15/1610722.aspx
中国象棋对战程序C语言源代码
http://blog.csdn.net/ctu_85/archive/2007/05/04/1596351.aspx
发表于 @ 2006年11月02日 17:12:00|评论(loading...)|编辑