MIPS中的功能(程序)

Sne*_*meh 16 procedure function mips

我是MIPS语言的新手,我不明白MIPS汇编语言中的函数(过程)是如何工作的.这是但我会指出我的问题:

  1. 什么:

    • jal
    • jr
    • $ra

    意思是mips语言和重要的事情

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

Mih*_*rtu 20

首先,您可能想要查看快速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
Run Code Online (Sandbox Code Playgroud)

您将注意到在SPIM仿真器中运行它时,剩下的值$t0是3,即在所谓的过程中加载的值.

希望这可以帮助.


小智 10

1.前两个是指令,第三个是特殊注册

  • jal =跳转和链接(下拉指令的地址放入$ ra,并跳转到目标地址)
  • jr =跳转以指定寄存器
  • $ ra =返回地址

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

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

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

2.

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

int main(){
   x=addthem(a,b);
}
int addthem(int a, int b){
   return a+b;
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)