【问题标题】:MIPS-Assembly: How to 'define' subroutine for later useMIPS-Assembly:如何“定义”子程序供以后使用
【发布时间】:2018-09-30 01:04:46
【问题描述】:

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

【问题讨论】:

  • 只需将例程放在控制流通常无法到达的位置,例如在你的主要程序之后。
  • 你能举个例子吗? MIPS 中“主程序”的语义是什么?似乎有一些针对此的指令,但我还没有找到正确的指令。
  • 除非您重定向它,否则执行会从一条指令进行到下一条指令。在 SPIM 中,我猜想执行从文本段的开头开始。你通过执行系统调用 10 退出程序。如果你把你的例程放在之后,除非你明确地调用它,否则控制永远不会到达它。

标签: assembly mips mips32 mars-simulator


【解决方案1】:

除非您重定向它,否则执行会从一条指令进行到下一条指令。在 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

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多