2017-03-21 7 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と$ a1からそれぞれ渡されるものとします。返される値はレジスタ$ v0に格納されます。この手順でスタックを使用する場合は、スタックを使用して他のレジスタを格納する必要があることに注意してください。 – Shubham

+0

これは私の質問の全体的な必要条件でした – Shubham

+0

@SRingne:確かに、呼び出し規約やその他の細かい細部まで割り当てられている必要があります。関数の要点を生成するためにgodboltを使用することは、 ... –

関連する問題