【问题标题】:What is a function/How to distinguish a function in MIPS?什么是函数/如何区分 MIPS 中的函数?
【发布时间】:2014-04-21 09:31:58
【问题描述】:

MIPs 汇编语言非常新——我找不到一个链接专门告诉一个函数在 MIPS 中的区别,我们如何使用 jal,jr 的示例,等等。

很难找出这些操作是如何工作的——我的这部分课程的教科书非常宽泛,假设我已经知道该语言并且只是概述了一个代码(假设我确切地知道代码是什么)意思)

因此,这本书对我没有帮助,所以我正在尝试自己练习..

任何人,在我的课堂上,我们编写了一个简单的数组代码,据说里面有一个“函数”。

我的问题是——我怎么知道什么是“功能” 下面是我们在课堂上做的代码——它应该输出一个从 1 到 10 的数组。我理解它在哪里递增等等(addi)以及为什么它是 1 和 4,但我不明白 $ra, jal , jr 是什么意思...但我假设这些与“功能”有关

#Load an array and display

    .data

    .align 2
a1:     .space 40

    .text
    .globl main
main:
    la $s0, a1
    jal loadArray
    la $s0, a1# <- return here after function return
    jal displayArray
    # <- return here after 2nd function
exit:
    li $v0, 10
    syscall

displayArray:
    #$ra = the address of line 14
    li $t0, 1   #int i = 0
    displayLoop: blt $t0, 11, display
        #else
        jr $ra
    display:
        lw $t0, ($s0)   # a1[i] = i;

    li $v0, 1
    move $a0, $t0
    syscall

    #incremment i and array pointer
    addi $t0, $t0, 1
    addi $s0, $s0, 4

    j displayLoop

loadArray:
    #$ra = the address of line 14
    li $t0, 1   #int i = 0
    loadLoop: blt $t0, 11, load
        #else
        jr $ra
    load:
        sw $t0, ($s0)   # a1[i] = i;

        #incremment i and array pointer
        addi $t0, $t0, 1
        addi $s0, $s0, 4

        j loadLoop

所以这是示例代码,但此代码与仅带有标签的普通代码之间的唯一区别是跳转寄存器以及跳转和链接...... 那能区分什么是函数吗???

对不起,长长的文字墙——TL;DR 在 MIPS 中,你怎么知道什么是“函数”我知道标签是什么(obv.)但不是函数......

这对我来说并不像在 cpp 或 java 中那样直截了当。

【问题讨论】:

    标签: function mips


    【解决方案1】:

    函数(或子例程)实际上只是您可以调用(使用jal)并期望调用的任何一段代码返回给你(jr $ra)。通常还希望在整个调用过程中保持堆栈和寄存器不变。

    函数这个术语更常用于 C 等高级语言,而 子例程 则更常见于汇编语言级别。

    jal 的意思是“跳转和链接”——我希望你的教科书中会涉及到这一点。这条指令1)将返回地址(指令的地址jal之后)存储在$ra链接寄存器中(或返回地址寄存器),然后2)跳转到目标地址。这就是您调用函数的方式。

    当函数完成后,它返回到调用者,通过跳转到返回地址寄存器中的地址,使用jr $ra指令(跳转到寄存器@ 987654332@).

    你的 cmets 暗示你已经明白这一点:

    jal loadArray
    la $s0, a1# <- return here after function return
    jal displayArray
    # <- return here after 2nd function
    

    所以loadArray 可以被视为一个函数,displayArray 也可以。

    阅读更多:

    【讨论】:

    • 这些是我在 TA 解释该特定行时写的 cmets。但是,是的,我现在明白了。谢谢!
    • @user3377643 不客气。欢迎来到堆栈溢出。请记住对任何对您有帮助的答案进行投票,并接受最能解决您问题的答案。
    • 另外,感谢关​​于信息的额外网页!它有很大帮助。另外,是的,我是该网站的新手,不知道如何投票,但我现在做到了:D。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多