2016-08-15 6 views
0

私はCコードをMIPSアセンブリに変換しようとしていました。ここにはスニペットがあります。問題は、私が正しい道に沿って行くのかどうか確信が持てないということです。私は、誰かが助けてくれることを願っています。 アセンブリへのCコード

この

は、元の質問だった:

void swap(int v[], int k, int j) { 
int temp; 
temp = v[k]; 
v[k] = v[j]; 
v[j] = temp; 
} 

、これは私が持っているどのくらいです:

swap: 
addi  $sp, $sp, -4 
sw  $s0, 0($sp) 
add  $s0, $zero, $zero 
L1: add $t1, $s0, $a1 
lb  $t2, 0($t1) 
add  $t3, $s0, $a0 
sb  $t2, 0($t3) 
beq  $t2, $zero, L2 
addi  $s0, $s0, 1 
j L1 
L2:  lw $s0, 0($sp) 
addi  $sp, $sp, 4 
jr  $ra 

さてさて、これは私の知る限りが持っているようです。この権利をしているのですか、それとも完全に失ってしまったのですか?

+1

質問は表示されません。 SOの質問方法については、一番上の行のヘルプボタンを参照してください。手元にある問題、つまりCコードからアセンブラを生成するために、私が知っているすべてのコンパイラは、それを生成するコマンドラインスイッチを持っています。例:gccには '-S'があります。あなたの問題は何ですか? –

+4

ループがありますが、Cコードにはループがありません。配列は、4バイトまたは32ビットと仮定できるint型です。だから、kを4倍したり、左に2シフトしたり、それをvに加えてtempにロードする必要があります。その後、vにj回目のオフセットを4回作成し、v + k回に格納します。4. tempをvプラスj回に入れます。4.コードはそれを実行していますか? –

+1

ポスターは、MIPSアセンブラとC呼び出し規約を学んでいるようです。私には公正な質問のようです。しかし、ここではMIPSの専門家がほとんどいないため、与えられたCコンパイラからasmファイルを生成することをお勧めします。 –

答えて

-2

ここには、コードをアセンブリに変換するfree online toolがあります。

addiu $sp,$sp,-24 
$LCFI0: 
    sw $fp,20($sp) 
$LCFI1: 
    move $fp,$sp 
    movz $31,$31,$0 
$LCFI2: 
    sw $4,24($fp) 
    sw $5,28($fp) 
    sw $6,32($fp) 
    lw $2,28($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $2,0($2) 
    nop 
    sw $2,8($fp) 
    lw $2,28($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $3,32($fp) 
    nop 
    sll $3,$3,2 
    lw $4,24($fp) 
    nop 
    addu $3,$4,$3 
    lw $3,0($3) 
    nop 
    sw $3,0($2) 
    lw $2,32($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $3,8($fp) 
    nop 
    sw $3,0($2) 
    move $sp,$fp 
    lw $fp,20($sp) 
    addiu $sp,$sp,24 
    j $31 
    nop 
+1

であり、手作業よりも最適化されておらず、解釈および/またはコード化がはるかに難しい。 –

+0

私は編集しましたが、* mips *の部分だけを見たわけではありませんでした。 – Hedron

+0

@Siguzaいいえ、それはmipsです。 'lw'と' sw'命令に注意してください。そして、三倍引数 'addu'命令など –

3

ブレークがダウンし、それが

V、Kおよびjは、我々が想定するレジスタとして入って来実装:

はここで変換されたコードです。あなたはあなたがスクラッチ・レジスタを使用することができますアドレスのV +(K < < 2)とV +(J < < 2)を構築する必要があり

は、私はあなたが文句を言わない、もはやそれを必要とするので、あなたもKとJの着信レジスタをごみ箱を前提としています。

k = k << 2; 
k = k + v 
j = j << 2; 
j = j + v 
temp0 = load(k) 
temp1 = load(j) 
store(k) = temp1 
store(j) = temp0 

あなたはそれをasmに変換することができるはずです。指示の一部を再配置しても動作させることができます。

編集、私はあなたにそれを理解させますが、私は不正行為をせずに最初にコンパイルします。しかし、gccは同じ基本的な命令を生成していました。 2つのシフト、2つが2つのロード、2つのストアを追加します。

関連する問題