将 C++ 函数转换为 MIPS

Convert C++ function to MIPS

如果给你:

calc (int b) {
return b - 2;
}

如何转换为 MIPS?

我考虑了以下几点:

addi $v0, $a0, -2
jr $ra
***********************
jr $ra
addi $v0, $a0, -2
***********************
addi $v0, $a0, 2
jr $ra 
***********************
lw $v0, 0($a0)
addi $v0, $v0, -2
jr $ra

我正在学习 MIPS 中的函数,希望得到建议。在这种情况下使用 'lw' 指令有什么意义吗?

你的结果是正确的,至少第一个是正确的。根据 here 你的第一个答案:

addi $v0, $a0, -2
jr $ra

是正确的。它使用最少的指令来提高执行速度,更不用说使用立即指令减少从内存中获取数据。查看 link 中的 table 并会告诉您:

  • $v0 是函数第一个 return 值应该去的寄存器。
  • $a0是调用函数时使用的第一个入参寄存器。
  • $ra 是保存前一个跳转指令的 return 地址的寄存器。

所以有人想调用你的汇编函数,它看起来像:

int x = calc(5); // This line is the `C` equivalent and not part of assembly code.

程序集将是:

li $a0, 5  # Load immediate the value 5 into register $a0.
jal __calc # Jump to the sub routine '__calc' and store return address in $ra.
           # Result will now be in $v0.
...

__calc:
  addi $v0, $a0, -2
  jr $ra 

如果可以,请尽量远离 lw 之类的指令。它们会进入 RAM 并获取内存,这与将值保存在 CPU 的寄存器中相比非常慢。