以下程序不会停止。如何让它停止?
.data
message: .asciiz "Calling the Procedure."
exitMessage: .asciiz "\nExiting properly"
.text
main:
jal DisplayMessage
jal exit
#End of the program.
#DisplayMessage - procedure
DisplayMessage:
jal DisplayActualMessage
jr $ra # return to the caller
#DisplayActualMessage - procedure
DisplayActualMessage:
li $v0, 4
la $a0, message
syscall
jr $ra # return to the caller
#Exit function
exit:
li $v0, 4 #Print code
la $a0, exitMessage #Load the message to be printed
syscall #Print command ends
li $v0, 10 #Exit code
syscall
是否可以创建一个通用功能来打印不同的短信?
答案 0 :(得分:2)
jal
指令修改了$ra
寄存器,所以会发生什么:
jal DisplayMessage
将$ra
设置为指向其后的指令。DisplayMessage
使用DisplayActualMessage
调用jal DisplayActualMessage
,因此现在$ra
将设置为指向jr $ra
中的DisplayMessage
。DisplayActualMessage
返回,并在jr $ra
DisplayMessage
处继续执行。$ra
仍指向同一位置,因此您最终会遇到无限循环。当您在MIPS程序集中获得嵌套函数调用时,必须以某种方式保存和恢复$ra
寄存器。您可以将堆栈用于此目的。那么DisplayMessage
将成为:
DisplayMessage:
addiu $sp, $sp, -4 # allocate space on the stack
sw $ra, ($sp) # save $ra on the stack
jal DisplayActualMessage
lw $ra, ($sp) # restore the old value of $ra
addiu $sp, $sp, 4 # restore the stack pointer
jr $ra # return to the caller
DisplayActualMessage
无法以相同的方式更改,因为它不会调用任何其他功能。