Assembly MIPS组装:如何';定义';供以后使用的子程序

Assembly MIPS组装:如何';定义';供以后使用的子程序,assembly,mips,mips32,mars-simulator,Assembly,Mips,Mips32,Mars Simulator,关于如何正确遵循MIPS函数调用约定,有很多很好的例子。然而,我被困在如何仅在“调用”时使用函数的问题上。以下内容将打印51(使用MARS): 但是,我确实希望在跳转并链接到时(当“调用”时),只能执行与printnl标签相关联的指令。这在MIPS中可行吗?请随意批评我的设计倾向,作为你答案的一部分。我不知道该如何编写一个可能需要大量重复指令的简单汇编程序 我确实尝试过这个(但它没有组装): 除非重定向指令,否则执行会从一条指令转到下一条指令。在SPIM中,我猜执行从文本段的开头开始,在调用退出

关于如何正确遵循MIPS函数调用约定,有很多很好的例子。然而,我被困在如何仅在“调用”时使用函数的问题上。以下内容将打印51(使用MARS):

但是,我确实希望在跳转并链接到时(当“调用”时),只能执行与
printnl
标签相关联的指令。这在MIPS中可行吗?请随意批评我的设计倾向,作为你答案的一部分。我不知道该如何编写一个可能需要大量重复指令的简单汇编程序

我确实尝试过这个(但它没有组装):


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

        .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

只需将程序放在控制流通常无法到达的位置,例如,在你的主程序之后。你能给我一个例子吗?MIPS中“主例程”的语义是什么?似乎有一些指令可以实现这一点,但我还没有找到正确的指令。除非您重定向指令,否则执行会从一条指令进行到下一条指令。在SPIM中,我猜执行从文本段的开头开始。通过执行系统调用10退出程序。如果你把你的例程放在后面,除非你明确地调用它,否则控制永远不会到达它。
.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
        .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