C++ 转换为C++;函数到MIPS

C++ 转换为C++;函数到MIPS,c++,function,mips,code-conversion,C++,Function,Mips,Code Conversion,如果给你: 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 我正

如果给你:

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”指令有什么意义吗?

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

addi $v0, $a0, -2
jr $ra
这是正确的。它使用的指令量最少,可以提高执行速度,更不用说使用即时指令可以减少从内存中获取的数据。查看链接中的表格,会告诉您:

  • $v0
    是函数的第一个返回值应该到达的寄存器
  • $a0
    是调用函数时要使用的第一个输入参数的寄存器
  • $ra
    是保存前一跳转指令返回地址的寄存器
有人想调用你的汇编函数,它看起来像:

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寄存器中要慢得多。

Andre,在存储返回地址的ABI变量中,参数是如何传递的?MIPS的版本是什么?有“分行”吗?LW用于从RAM内存加载数据:我注意到我试图在MIPS中编写的一些函数,包括这一个,当我使用诸如“LW”或“sw”之类的指令时,我收到一个错误。通常错误消息是:“获取地址未在字边界上对齐”。这对您提到从RAM获取值有什么意义吗?请记住,我正在使用:ori$a0,$0,5初始化$a0到5以进行测试。如果我不限制$a0的值,您认为我可以使用“lw”指令避免错误吗?这只是出于好奇,我已经对你的答案很满意。如果你想要寄存器中的值,比如寄存器中的
5
,$a0,你可以使用'load immediate'指令
li
li$a0,5
与$a0=5相同。使用诸如
lw
sw
之类的指令时,需要寄存器和RAM地址。如果使用
lw$a0,5
,这与将地址
5
处的RAM内容加载到
$a0
中相同,RAM中的内容可以是任何内容。RAM地址
5
可能被限制用于内核使用,用户空间内存在RAM地址中的起始位置较高,这将导致获取错误。“获取地址未在字边界上对齐”是另一个问题。字是CPU的寄存器大小,假设是32位。这意味着在读写RAM时,您提供的地址必须是32位对齐的。在不知道你的设置的确切细节的情况下,这是我能给出的最好答案。通常任何RAM地址都是有效的。