2016-04-10 9 views
-1

私はC言語のコードをMIPSアセンブリに変換することを含むクラスのプロジェクトを進めています。私はこのコード変換する問題を抱えています:アクセス番号の人は別のレジスタに格納されています

r[extract(ir,15,11)] = aluout; 

は基本的には、rは[]それはextract関数からの結果に基づいて、アクセスに登録するかを決定、あなたが見ることができるようにC.内のレジスタを表す配列です。 MIPSにこれのようなものはありますか?私がそれをすると考えることができる唯一の方法は、私が抽出サブルーチンから戻ってすべてのレジスタ番号に対してチェックするという価値を取ることです。これのC表現は次のようになります:

regNum = extract(ir, 15, 11); 
if (regNum == 1) { 
    r[1] = aluout; 
} else if (regNum == 2) { 
    r[2] = aluout; 
} else if (regNum == 3) { 
    r[3] = aluout; 
} ... 

アイデアはありますか?これが唯一の方法ですか?

+1

あなたは配列をインデックスできます。しかし、生のレジスタをインデックスすることはできません。 – Jester

+0

ええ、私は知っています。 Cコードは私たちの教授が私たちにMIPSに翻訳しなければならないものを与えたものです。あなたがMIPS – wKavey

+3

に翻訳していたならば、r [index]はレジスタ$ [index]を表しているだけなので、(MIPS?)CPUをエミュレートするはずのMIPSアセンブリプログラムを書いています。私はちょうどあなたがCと同じように配列にエミュレートされたレジスタを保持したいと思うでしょう。あなたのプログラムで何かのためにいくつかの実際のレジスタが必要になるので、エミュレートされたすべてのレジスタを実レジスタに保持できません。 –

答えて

0

自己変更コードを使用する予定ですか?例えば実行しようとしている命令にレジスタ番号を入れますか?

問題は、(等var1var2)C内の複数の名前付き変数を有するVAR iの値を返すために有する、より類似しています。 iがコンパイル時定数の場合は、プリプロセッサでそれを行うことができます(。テーブルをジャンプし、分岐ツリー、または何でも)

#define expandvar(x) var ## x // two step process to macro-expand x before concat 
#define var(x) expandvar(x) 
#define wantvar 4 

int foo(void) { return var(wantvar); } 
// int foo(constexpr int i) { ... } // nope 

そうでなければ、あなたはしかし、あなたが望む実装することができswitch()が必要

をレジスタを間接的にメモリに格納し、その配列に可変オフセットを使用しない限り、レジスタの間接参照はありません。

これを実装する1つの方法は、ジャンプアドレスのテーブルではなく、計算されたジャンプを使用することです。あなたが欲しいREGがある時点で、この中にジャンプ

使用すると、1つのレジスタの値を取得したい場合は

# calculate $t0 = set_r0 + reg_num * 8. (probably using PC as the starting point, rather than actually referencing the address of set_r0) 
j $t0  # jump to one of the pairs. 

set_r0: 
    move $r0, src 
    j end 
    move $r1, src 
    j end 
    ... 

のシーケンスを持っていますが、他のすべてを壊し、

move $r30, $r31 
    move $r29, $r30 
    move $r28, $r29 
    ... 
    move $r0, $r1 
たい読む。

関連する問題