我必须将以下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
我可以为此获得更好的解决方案吗?
答案 0 :(得分:1)
目前您正在为x86-64生成代码 - 您需要select a MIPS compiler from the popup menu above the assembly pane:
在您完成后,您可能会看到生成的代码如下:
$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