MIPS-Assembly:如何 'define' 子程序供以后使用

MIPS-Assembly: How to 'define' subroutine for later use

关于如何正确遵循 MIPS 函数调用约定的优秀示例数不胜数。但是,我对如何 仅在 'called' 时使用函数感到困惑。以下将打印 51(使用 MARS):

.data
strproc: .asciiz "procedure example"
strnl: .ascii "\n"

.text
printnl: li $v0, 1
li $a0, 5
syscall

#jal printnl

li $v0, 1
li $a0, 1
syscall

但是,我真的很想在跳转和链接到('called' 时)时只执行与 printnl 标签关联的指令。这在 MIPS 中可行吗?请随意批评我的设计倾向,作为您回答的一部分。我不确定我应该如何编写一个可能需要大量重复指令的简单汇编程序。

我确实试过了(但它没有 assemble):

.data
strproc: .asciiz "procedure example"
strnl: .ascii "\n"

printnl: li $v0, 1
li $a0, 5
syscall

.text
li $v0, 1
li $a0, 1
syscall
jal printnl

执行从一条指令到下一条指令,除非您重定向它。在 SPIM 中,我猜想执行从文本段的开头开始,到调用退出系统调用(系统调用 #10)时结束。如果您将例程放在退出系统调用、函数 return 或任何其他无条件分支之后,除非您显式调用它,否则控制永远不会到达它。例如:

        .data
strproc:.asciiz "procedure example"
strnl:  .ascii "\n"

        .text
        # entry point
        li $v0, 1
        li $a0, 1
        syscall     # print integer 1

        jal println # call println

        li $v0, 10
        syscall     # exit program

printnl:li $v0, 1
        li $a0, 5
        syscall     # print integer 5
        jr $ra      # return from function