2017-03-21 28 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生成函數的內容只是一個有用的幫助手... –