Function MIPS中的功能(过程)

Function MIPS中的功能(过程),function,mips,procedure,Function,Mips,Procedure,我是MIPS语言的新手,不了解MIPS汇编语言中的函数(过程)是如何工作的。以下是一些问题,但我将详细说明我的问题: 什么是: jal jr $ra 在mips语言中的意思和重要的事情 当我们想要创建函数或(过程)时,如何使用它们 首先,您可能需要检查快速MIPS引用。它真的帮助了我 其次,解释jal、jr和$ra。jal所做的是跳转到标签标签,并将程序计数器(将其视为当前指令的地址)存储在$ra寄存器中。现在,当您想从label返回到最初的位置时,只需使用jr$ra 下面是一个例子: .t

我是MIPS语言的新手,不了解MIPS汇编语言中的函数(过程)是如何工作的。以下是一些问题,但我将详细说明我的问题:

  • 什么是:

    • jal
    • jr
    • $ra
    在mips语言中的意思和重要的事情

  • 当我们想要创建函数或(过程)时,如何使用它们

  • 首先,您可能需要检查快速MIPS引用。它真的帮助了我

    其次,解释
    jal
    jr
    $ra
    jal
    所做的是跳转到
    标签
    标签,并将程序计数器(将其视为当前指令的地址)存储在
    $ra
    寄存器中。现在,当您想从
    label
    返回到最初的位置时,只需使用
    jr$ra

    下面是一个例子:

    .text
    main:
    li $t0, 1
    jal procedure # call procedure
    li $v0, 10
    syscall
    
    procedure:
    li $t0, 3
    jr $ra # return
    
    在SPIM仿真器中运行时,您会注意到,
    $t0
    中的剩余值是3,即所谓过程中加载的值

    希望这对您有所帮助。

    您将需要阅读。这描述了用于调用函数的约定,特别是如何管理堆栈和交换参数(MIPS中没有硬件堆栈,一切都是软件约定的问题,ABI定义了这些约定)

    上面的文档假定您了解MIPS指令的一些基本功能,因此您还需要,特别是第二卷(指令集),其中描述了每条指令的详细效果。但是,帮你自己一个忙,先下载并阅读第一卷(简介)


    jal
    指令是“跳转链接”操作码。它跳转到目标地址(即被调用过程的第一个操作码的地址),同时将当前指令指针保存到链接寄存器(即寄存器31)中(准确地说,它将值x+8保存在寄存器31中,其中x是
    jal
    操作码本身的地址)。

    前两个是指令,第三种是特殊语域

    • jal=跳转和链接(以下指令的地址放入$ra,并跳转到目标地址)
    • jr=跳转到指定寄存器
    • $ra=返回地址
    我们经常使用这样的指令

    • jr$ra(将$ra复制到程序计数器)
    它意味着返回(跳转)到$ra中保存的地址

    二,

    下面是C语言中的一个示例函数(过程)

    MIPS中的函数

    .text
    main:    #assume value a is already in $t0, b in $t1
        add $a0,$0,$t0   # it's the same function as move the value
        add $a1,$0,$t1 
        jal addthem      # call procedure
        add $t3,$0,$v0   # move the return value from $v0 to where we want
        syscall
    
    addthem:
        addi $sp,$sp,-4     # Moving Stack pointer
        sw $t0, 0($sp)      # Store previous value
    
        add $t0,$a0,$a1     # Procedure Body
        add $v0,$0,$t0      # Result
    
        lw $t0, 0($sp)      # Load previous value
        addi $sp,$sp,4      # Moving Stack pointer 
        jr $ra              # return (Copy $ra to PC)
    
    • jal:aka针对任何函数名的跳转和链接将重定向到所需函数
    • jr$ra:它返回调用的函数的值
  • 主要功能:

       .data
    
                x: .word 3                        # initializing x to be 3
                y: .word 5                        # initializing y to be 5
                answer: .word 0                   # intialzing answer to be 0
                prompt: .asciiz "Add X to Y: "    # console prompt for final answer
    
       .text
    
       .globl main
    
       .ent main
    
        main:
    
                 lw $a0, x                         # pass arguments to function $a0 - x, $a1 - y
                 lw $a1, y
                 jal adds                          # adds function is called
                 sw $v0, answer                    # answer from the returned value
    
                 la $a0, prompt                    # displaying prompt on the console
                 li $v0, 4
                 syscall
    
                 lw $a0, answer                    # displaying final answer on the console
                 li $v0, 1
                 syscall
    
                 li $v0, 10                        # end program
                 syscall
    
        .end main
    
        .globl adds
    
        .ent adds
    
        adds:                                      # adds function
    
                  li $v0, 0                                          
                  add $v0, $a0, $a1                # adding arguments to the callee
                  jr $ra                           # return
    
       .end adds
    
    添加功能:

       .data
    
                x: .word 3                        # initializing x to be 3
                y: .word 5                        # initializing y to be 5
                answer: .word 0                   # intialzing answer to be 0
                prompt: .asciiz "Add X to Y: "    # console prompt for final answer
    
       .text
    
       .globl main
    
       .ent main
    
        main:
    
                 lw $a0, x                         # pass arguments to function $a0 - x, $a1 - y
                 lw $a1, y
                 jal adds                          # adds function is called
                 sw $v0, answer                    # answer from the returned value
    
                 la $a0, prompt                    # displaying prompt on the console
                 li $v0, 4
                 syscall
    
                 lw $a0, answer                    # displaying final answer on the console
                 li $v0, 1
                 syscall
    
                 li $v0, 10                        # end program
                 syscall
    
        .end main
    
        .globl adds
    
        .ent adds
    
        adds:                                      # adds function
    
                  li $v0, 0                                          
                  add $v0, $a0, $a1                # adding arguments to the callee
                  jr $ra                           # return
    
       .end adds
    

    这是家庭作业问题吗?wikipedia的文章()解释了“jal”和“jr”的说明,也许它回答了你的问题。thanx非常好,伙计,它很有帮助,链接也很有用