2017-03-21 24 views
-2

我有下面的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

请定义*更好的解决方案*。你有什么尝试? – Raptor

+0

@Raptor:我不知道解决方案先生,我试过在线编译链接,但我想它是不正确的。 这就是为什么我想要更好的解决方案 – Shubham

+1

@S Ringne:这一切取决于您打算调用编译函数的特定操作环境,特别是它是32位还是64位MIPS以及使用的调用约定。孤立地编译单个函数是一件相当棘手的事情,所以我认为你可以通过更具体地描述你需要编码和如何将它集成到系统中来解决这个问题。 – doynax

回答

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 
+0

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

+0

这是我的问题的总体要求 – Shubham

+0

@SRingne:当然 - 显然你需要照顾调用约定和作业中的其他小细节 - 使用godbolt生成函数的内容只是一个有用的帮助手... –