将C程序转换为MIPS

时间:2017-03-21 08:31:03

标签: c mips

我必须将以下C函数转换为MIPS:

int my_function(int x, int y)
{
 int i,a;
 a = x+y;
 i = x-2;
 a = a+i;
 return a;
}
  

假设变量x和y分别从参数寄存器$ a0和$ a1传递。返回的值应存储在寄存器$ v0中。请注意,如果在此过程中使用堆栈,则需要使用堆栈来存储任何其他寄存器。

由于我是MIPS的新手,我尝试引用C to MIPS online convertor并得到了这个结果:

my_function(int, int):
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-20], edi
    mov     DWORD PTR [rbp-24], esi
    mov     edx, DWORD PTR [rbp-20]
    mov     eax, DWORD PTR [rbp-24]
    add     eax, edx
    mov     DWORD PTR [rbp-4], eax
    mov     eax, DWORD PTR [rbp-20]
    sub     eax, 2
    mov     DWORD PTR [rbp-8], eax
    mov     eax, DWORD PTR [rbp-8]
    add     DWORD PTR [rbp-4], eax
    mov     eax, DWORD PTR [rbp-4]
    pop     rbp
    ret

我可以为此获得更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

目前您正在为x86-64生成代码 - 您需要select a MIPS compiler from the popup menu above the assembly pane

enter image description here

在您完成后,您可能会看到生成的代码如下:

$LFB0 = .
my_function(int, int):
$LVL0 = .
        addu    $2,$4,$5
$LVL1 = .
        addiu   $4,$4,-2
$LVL2 = .
        j       $31
        addu    $2,$4,$2

请注意,编译器已优化了原始C代码中的一些冗余操作。如果你想查看未经优化的版本specify -O0 in the compiler options,那么你会看到效率低得多的东西,但更接近原始来源:

$LFB0 = .
my_function(int, int):
        addiu   $sp,$sp,-16
        sw      $fp,12($sp)
        move    $fp,$sp
        sw      $4,16($fp)
        sw      $5,20($fp)
        lw      $3,16($fp)
        lw      $2,20($fp)
        addu    $2,$3,$2
        sw      $2,0($fp)
        lw      $2,16($fp)
        addiu   $2,$2,-2
        sw      $2,4($fp)
        lw      $3,0($fp)
        lw      $2,4($fp)
        addu    $2,$3,$2
        sw      $2,0($fp)
        lw      $2,0($fp)
        move    $sp,$fp
        lw      $fp,12($sp)
        addiu   $sp,$sp,16
        j       $31
        nop