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
关于如何正确遵循 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