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 -O0
in 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