如何让这个程序在MIPS中运行?

时间:2015-08-28 18:59:50

标签: assembly mips

以下程序不会停止。如何让它停止?

.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

是否可以创建一个通用功能来打印不同的短信?

1 个答案:

答案 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 无法以相同的方式更改,因为它不会调用任何其他功能。