簡體   English   中英

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

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

關於如何正確遵循 MIPS 函數調用約定,有很多很好的例子。 但是,我只在 'call' 時才遇到如何使用函數的問題 以下將打印 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

除非您重定向它,否則執行會從一條指令進行到下一條指令。 在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM