MIPS 中的函数(过程)

Posted

技术标签:

【中文标题】MIPS 中的函数(过程)【英文标题】:the functions (procedures) in MIPS 【发布时间】:2011-05-11 12:27:39 【问题描述】:

我是 MIPS 语言的新手,我不明白 MIPS 汇编语言中的函数(过程)是如何工作的。以下是,但我会具体说明我的问题:

    做什么:

    jal jr $ra

    在 mips 语言中的意思和重要的事情

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

【问题讨论】:

这是作业题吗?***文章 (en.wikipedia.org/wiki/MIPS_architecture#MIPS_assembly_language) 解释了“jal”和“jr”指令,也许它回答了你的问题。 【参考方案1】:

首先,您可能需要查看this 快速 MIPS 参考。它真的帮助了我。

其次,解释jaljr$rajal <label> 所做的是跳转到label 标签并将程序计数器(将其视为当前指令的地址)存储在$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,即在所谓的 procedure 中加载的值。

希望这会有所帮助。

【讨论】:

非常感谢老兄,它有很大帮助,链接也【参考方案2】:

1.前两个是指令,第三个是特殊寄存器

jal=jump and link(后面指令的地址放入$ra,跳转到目标地址) jr=跳转到指定寄存器 $ra=返回地址

我们经常使用这样的指令...

jr $ra(复制 $ra 到程序计数器)

表示返回(跳转)到 $ra 中保存的地址。

2.

这是 C 中的示例函数(过程)

int main()
   x=addthem(a,b);

int addthem(int a, int b)
   return a+b;

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)

【讨论】:

【参考方案3】:

您会想阅读System V Application Binary Interface, MIPS RISC Processor Supplement。这描述了用于调用函数的约定,特别是如何管理堆栈和交换参数(MIPS 中没有硬件堆栈,一切都是软件约定的问题,而 ABI 定义了这些约定)。

上面的文档假设了 MIPS 指令的一些基本知识,所以你还需要MIPS32 Architecture for Programmers,特别是第二卷(指令集),它描述了每条指令的详细效果。但是,帮自己一个忙,先下载并阅读第一卷(介绍)。

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

【讨论】:

【参考方案4】:
jal: 又名跳转和链接到任何函数名,会将您重定向到所需的函数。 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

【讨论】:

以上是关于MIPS 中的函数(过程)的主要内容,如果未能解决你的问题,请参考以下文章

ARM 处理器上的 MIPS 计算

linux内核__define_initcall分析

内存管理初始化源码1:setup_arch

MIPS汇编及模拟器下载

求mips交叉编译工具链

如何在linux主机上运行/调试 arm/mips架构的binary