如何在MIPS中使用函数

如何在MIPS中使用函数,mips,Mips,我刚开始使用MIPS,对MIPS中main函数的调用感到困惑,比如如何发送参数并从函数中获取返回值。如果您能提供一些帮助,我们将不胜感激。以下是一段简单的代码,可以帮助您了解如何在MIPS中实现函数。这里我们只是使用一个函数来计算三个值的和 .data A: .word 2 B: .word 3 C: .word 9 Answer: .word 0 .text .globl main main: #These are basically the parameters lw $a0, A

我刚开始使用MIPS,对MIPS中main函数的调用感到困惑,比如如何发送参数并从函数中获取返回值。如果您能提供一些帮助,我们将不胜感激。

以下是一段简单的代码,可以帮助您了解如何在MIPS中实现函数。这里我们只是使用一个函数来计算三个值的和

.data
A: .word 2
B: .word 3
C: .word 9
Answer: .word 0
 
.text
.globl main

main:

#These are basically the parameters
lw $a0, A   #Load value from memory location A into the register $a0
lw $a1, B   #Load value from memory location B into the register $a1
lw $a2, C   #Load value from memory location C into the register $a2

jal Sum     #Calling the function

sw $v0, Answer  #Storing the contents of $v0 into the memory location Answer(The returning value)

li $v0, 10
syscall
.end main

.globl Sum      #Function for Sum
.ent Sum

Sum:

add $v0, $a0, $a1
add $v0, $v0, $a2

jr $ra
.end Sum
您可以按照注释进行操作,并查看函数的使用方式。以下是一些需要注意的要点: 寄存器和堆栈的组合用于参数转换。整数参数使用寄存器$a0、$a1、$a2、$a3传递,浮点值可以使用$f12和$f14传递。根据参数是整数还是浮点,第一个参数应以$a0或$f12形式传递。类似地,第二个参数应在$a1或$f14中传递。对于integer,第三个参数必须以$a2形式传递,如果第三个参数是float,则必须在堆栈上传递。类似地,第四个参数必须在$a3上传递,如果第四个参数是float,则必须在堆栈上传递。在堆栈上传递任何附加参数。 整数寄存器$v0/$v1用于从函数调用返回整数值,浮点寄存器$f0和$f1用于从函数返回浮点值。 对函数的调用如下所示: 日本航空公司名称, 鉴于函数的返回如下所示: jr$ra。 您还可以使用下面提到的书作为使用QTSpim软件学习MIPS的指南,它可能会帮助您解决任何其他困惑。 MIPS汇编语言编程使用QtSpim Ed Jorgensen博士。版本1.1.50 2019年7月。 希望这有帮助。

  • 向函数发送参数: 使用$a0或$f12($a0如果是整数或$f12如果是浮点单精度或双精度)传递第一个参数。 使用$a1或$f14($a1如果是整数,则为a1;如果是浮点单精度或双精度,则为$f14)传递第二个参数。 使用$a2传递第三个参数(仅限整数)。如果第三个参数是float,则必须在堆栈上传递它。 使用$a3传递第四个参数(仅限整数),但如果第四个参数是float,则必须在堆栈上传递
请记住:如果第一个参数是整数,则使用$a0,然后不使用$f12。如果第一个参数是浮点值,则使用$f12,而不使用$a0。任何附加参数都会传递到堆栈上

在使用跳转命令调用函数之前,根据以上几点移动将作为参数传递给函数的临时寄存器的内容

  • 从函数返回值:
整数寄存器$v0或$v1/$v0用于从 功能。浮点寄存器$f0和$f1用于返回
函数的浮点值。

函数初始化:

.globl functionName
.ent functionName

functionName:

#Code here

.end functionName
呼叫约定:

.globl functionName
.ent functionName

functionName:

#Code here

.end functionName
-论据: ◦ 第一个参数以$a0$f12形式传递(如果为整数,则为$a0;如果为整数,则为$f12) 浮动单精度或双精度)。 ◦ 第二个参数以$a1$f14的形式传递(如果为整数,则为$a1;如果为整数,则为$f14) 浮动单精度或双精度)。 ◦ 第三个参数传入$a2(仅限整数)。 ◦ 如果第三个参数是float,则必须在堆栈上传递它。 ◦ 第四个参数传入$a3(仅限整数)。 ◦ 如果第四个参数是float,则必须在堆栈上传递它

其余参数在堆栈上传递。应在堆栈上放置参数 按相反的顺序在堆栈上。按引用调用参数加载地址(la指令) 并按值调用加载值

调用函数: 为了从main调用函数,您将使用
jal functionName

返回函数: 为了返回到主函数,您将使用
jr$ra

功能结果: 整数寄存器$v0$v1/$v0用于从 函数/过程调用。浮点寄存器$f0$f1用于返回 函数/过程中的浮点值

注册保存约定: MIPS调用约定要求仅保存特定寄存器(而不是全部寄存器) 跨过程调用。 •程序必须保存整数寄存器$s0-$s7。 •程序必须保存浮点寄存器$f20-$f30