什么是功能/如何区分MIPS中的功能?

时间:2014-03-16 04:37:31

标签: function mips

MIP汇编语言非常新 - 我还没有找到一个专门告诉你在MIPS中区分功能的链接,我们如何使用jal的例子, jr等。

很难找到这些行为是如何运作的 - 本课程这一部分的教科书非常广泛,并假设我已经掌握了语言,并且只是概述了一个代码(假设我知道正是代码意味着什么)

因此,这本书并没有帮助我,所以我试图自己练习..

Anywho,在我的课上我们编写了一个简单的数组代码,据说它具有"功能"在它。

我的问题是 - 我怎么知道什么是"功能" 下面是我们在课堂上做的代码 - 它应该输出一个从1到10的数组..我理解它增加的位置和这样的(addi)以及为什么它是1和4但是我不喜欢&# 39;理解 什么$ 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中,你怎么知道什么是&#34;功能&#34;我知道标签是什么(obv。)但不是函数......

这不像我在cpp或java lol那样直截了当。

1 个答案:

答案 0 :(得分:1)

功能(或子程序)实际上只是您可以调用的任何一段代码(带jal)和期待回到你身边(jr $ra)。通常还希望在整个通话过程中保持堆栈和寄存器的完整性。

术语 function 更常用于C等高级语言,而子程序在汇编语言级别更常见。

jal表示&#34;跳转和链接&#34; - 我希望你的教科书能够涵盖这一点。该指令 1)存储jal中的返回地址( $ra之后的指令的地址),链接寄存器< / em>(或返回地址寄存器)然后 2)跳转到目标地址。这就是调用函数的方式。

当函数完成后,通过跳转到返回地址寄存器中的地址,使用jr $ra指令将返回(跳转到注册$ra)。

您的意见暗示您已经明白这一点:

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

因此可以将loadArray视为一个函数,displayArray也可以。

了解更多: