MIPS-Assembly:如何“定义”子例程以供以后使用

时间:2018-09-30 01:04:46

标签: assembly mips mips32 mars-simulator

关于如何正确遵循MIPS函数调用约定的例子很多。但是,我只能在“调用” 时使用使用函数。以下将打印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

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

我确实尝试过此操作(但无法组装):

.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

1 个答案:

答案 0 :(得分:1)

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

for i, j in enumerate(B):
    A[i][j] = 0