Function MIPS中的功能(过程)
我是MIPS语言的新手,不了解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
jal
jr
$ra
首先,您可能需要检查快速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复制到程序计数器)
.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非常好,伙计,它很有帮助,链接也很有用