Een C-programma converteren naar MIPS

Ik moet de volgende C-functie converteren naar MIPS:

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

Veronderstel dat de variabelen x en y worden doorgegeven uit respectievelijk de argumentregisters $a0 en $a1. De geretourneerde waarde moet worden opgeslagen in register $v0. Merk op dat u stapel moet gebruiken om andere registers op te slaan als u ze in deze procedure gebruikt.

Omdat ik nieuw ben bij MIPS, heb ik geprobeerd te verwijzen naar een C naar MIPS online converteren ik kreeg dit resultaat:

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

Kan ik hier een betere oplossing voor krijgen?


Antwoord 1, autoriteit 100%

Momenteel genereert u code voor x86-64 – u moet een MIPS-compiler selecteren in het pop-upmenu hierboven het montagevenster:

Nadat je dat hebt gedaan, zie je waarschijnlijk de gegenereerde code als volgt:

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

Merk op dat de compiler enkele van de overbodige bewerkingen in de oorspronkelijke C-code heeft weggewerkt. Als je een niet-geoptimaliseerde versie wilt zien, specificeer -O0in de compileroptiesen je zult iets zien dat veel minder efficiënt is, maar dichter bij de oorspronkelijke bron:

$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

Other episodes