0

質問。次のJavaコードフラグメントに相当するMIPSアセンブルコードを記述します。

    int x = 1 ;
    int y = 3 ;
    int c = 2 ;
    x = y - c ;
    if (x != y) { x = y + 5 ; }
    else { x = c ; } ;

これは私が現在持っているものです。

.data 
X: .word 1
Y: .word 3
C: .word 2
.text
main:
la $t1, X 
la $t2, Y
la $t3, C
lw $t1, ($t1)
lw $t2, ($t2)
lw $t3, ($t3)
sub $t1, $t2, $t3
li $v0, 1
beq $t1, $t2, iflabel
add $t1,$t3, 0 # sets x = c by adding zero to c and putting result in $t1 (register for x) used.
iflabel: add $t1,$t2,5
syscall
li $v0, 10

私が知る限り、「8」を印刷する必要がありますが、代わりに0は?!?であり、宿題の質問ではなく、MIPSの改訂の質問です。私のシステムコールはおそらく間違った場所にあり、おそらくエラーを引き起こしていると推測できますか?レジスタの内容を確認して各行を1つずつ実行できるため、MARSを使用してプログラムを実行していますが、それでも私の問題を助けません。

4

2 に答える 2

1

あなたの条件は逆です:今あなたはそれを持っているので、XはYに等しくなりますそれは5を追加します、しかしJavaコードからそれはあなたが逆にそれを望むように見えます:

bne $t1, $t2, iflabel

次に、+5コードが他の条件に流れ込みます。if / elseブロックの後にラベルが必要であり、if-trueコードを処理した後にラベルに分岐する必要があります。

$v0第三に、 syscallを実行する直前にベクトルをロードする必要があり、後で実行する理由はありません。

第4に、syscall1には整数が含まれている必要があります$a0.。Y+5またはC+0をに直接追加できます$a0

最終的なコードは次のようになります。

.data 
X: .word 1
Y: .word 3
C: .word 2

.text
main:
la $t1, X 
la $t2, Y
la $t3, C
lw $t1, ($t1)
lw $t2, ($t2)
lw $t3, ($t3)
sub $t1, $t2, $t3
bne $t1, $t2, iflabel
add $a0,$t3, 0
b endif
iflabel: add $a0,$t2,5
endif:
li $v0, 1
syscall
于 2012-04-18T21:55:17.810 に答える
0

あなたの整数は正しいレジスタにありますか?ここからは$a0

于 2012-04-18T21:47:03.783 に答える