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 参考。它真的帮助了我。
其次,解释jal
、jr
和$ra
。 jal <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 中,其中 x 是jal
操作码本身的地址)。
【讨论】:
【参考方案4】:主要功能:
.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 中的函数(过程)的主要内容,如果未能解决你的问题,请参考以下文章