2017-09-30 86 views
1

如果你给出:转换C++函数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'指令有什么意义吗?

+4

Andre,你的ABI变量中的参数是如何传递的,返回地址存储在哪里? MIPS的版本是什么?它是否有“分支[延迟插槽](https://en.wikipedia.org/wiki/Delay_slot)”? LW用于从RAM内存中加载数据:https://en.wikipedia.org/wiki/MIPS_architecture#Loads_and_stores – osgx

回答

1

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

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说明,如果你能躲得远远的。与保存CPU寄存器中的值相比,它们会跳出内存并获取超慢的内存。

+0

我注意到我在MIPS中编写的一些函数,包括这一个,当我使用像'lw'或'sw'这样的指令,我收到一个错误。 通常,错误消息显示为:“提取地址未在字边界上对齐”。这是否意味着你提到从RAM中获取值?请记住,我正在使用: ori $ a0,$ 0,5 将$ a0初始化为5用于测试目的。如果我不限制$ a0的价值,你认为我可以使用'lw'指令来避免错误吗?这只是出于好奇,我已经对你的答案感到满意。 – Andre

+1

如果你想在寄存器'$ a0'中的'5'这样的寄存器中得到一个值,你可以使用'load immediate'指令'li'。 'li $ a0,5'与$ a0 = 5相同。当使用像'lw'和'sw'这样的指令时需要寄存器和RAM地址。如果你使用'lw $ a0,5',就像将地址'5'处的RAM的内容加载到'$ a0'中一样,RAM中的内容可以是任何东西。 RAM地址'5'可能会限制内核使用,用户空间内存在RAM地址中开始较高,这会导致提取错误。 – user2205930

+1

'提取地址不符合WORD边界'的问题是另一个问题。WORD是CPU的寄存器大小,假设你的情况为32位。这意味着在读写RAM时,您提供的地址必须是32位对齐的。不知道你的设置的确切细节,这是我能给出的最佳答案。通常任何RAM地址都是有效的。 – user2205930