-1

If else条件を実装しようとしているMIPSプログラミングを学んでいます。しかし問題は、減算条件を選択するために 2 を入力すると、プログラムが動作しないことです。BNE を使うこともできたのですが、BEQ を学びたいと思っています。このコードの何が問題なのか教えてください

.text

main:

li $t0,1
li $t1,2
li $t2,3
li $t3,4

li $v0,5
syscall

move $s0,$v0

beq $s0,$t0,ADDTN
ADDTN:


li $a0,40
li $v0,1
syscall

li $v0,5
syscall


move $s1,$v0

li $v0,5
syscall

move $s2,$v0

add $a0,$s1,$s2

li $v0,1
syscall

li $v0,10
syscall



beq $s0,$t1,SUBTN
SUBTN:

li $a0,50
li $v0,1
syscall

li $v0,5
syscall


move $s3,$v0

li $v0,5
syscall

move $s4,$v0

sub $a0,$s3,$s4

li $v0,1
syscall

li $v0,10
syscall
4

3 に答える 3

2

equals で分岐を使用する場合、プログラムは実際に意味のある分岐を実行する必要があります。分岐命令を調べます。

    beq $s0,$t0,ADDTN
ADDTN:

MIPS では、特に指示がない限り、PC (プログラム カウンター) は単純に 1 行ずつ進むことを覚えておく必要があります。分岐命令は、PC をプログラム内の別の場所に向けることができます。ただし、コードでは、分岐命令はPCに次の行に進むように指示します。これは、プログラムが分岐命令なしで行うこととまったく同じです。

また、これらの特定のラベル ADDTN、SUBTN のみを実行する場合は、各ラベルの操作の最後にジャンプ命令が必要です。たとえば、ADDTN が終了すると、もちろん SUBTN も実行したい場合を除き、プログラムは SUBTN を超えてジャンプする必要があります。これはあなたができることの例です。PC を特定のオペレーター ラベルに迂回させ、各ラベルの最後で EXIT ラベルにジャンプする一連の分岐命令を用意します。

    beq $s0, $t1, SUBTN    # if(input==2) {goto SUBTN}
    beq $s0, $t0, ADDTN    # if(input==1) {goto ADDTN}
    beq $s0, $t2, MULT     # if(input==3) {goto MULT}
    beq $s0, $t3, DIV      # if(input==4) {goto DIV}


ADDTN:
    # Code for addition
    j EXIT

SUBTN:
    # Code for subtraction
    j EXIT

MULT:
    # Code for multiplication
    j EXIT

DIV:
    # Code for division
    j EXIT

EXIT:
    # Code to exit
    j EXIT

注: $s0 の値が 1、2、3、または 4 以外の場合、この例で何が起こるかを視覚化できるはずです。equals のいずれの分岐も PC をラベルにジャンプさせない場合、プログラムは ADDTN ラベルのコードを実行します。また、各ラベルが終了ラベル (EXIT) へのジャンプを生成しない場合、プログラムは残りのラベルの実行を続行します。

明示的な else ステートメントを実行する場合は、次の例を検討してください。

MAIN:    
    beq $s0, $t0, ADDTN    # if(input==2) {goto ADDTN}
    j SUBTN                # else {goto SUBTN}

ADDTN:
    # Code for addition
    j EXIT

SUBTN:
    # Code for subtraction
    j EXIT

EXIT:
    # Exit the program

この例では、最初の分岐で、入力が追加ラベルと相関するかどうかを確認します。存在する場合、PC はそのラベルにジャンプします。else if は、減算ラベルへのジャンプを指示する次の行に進みます。

于 2013-10-04T23:24:59.480 に答える
1

As this is homework:

If it's equal, it will jump to the offset specified by the label. And if it's not equal, what code do you expect it to execute?

于 2012-09-15T17:21:57.507 に答える
0

例えば:

beq $s0,$t0,ADDTN
ADDTN:
     # code for addition
     # ...
     # some syscalls
beq $s0.$t1,SUBTN
SUBTN:
 .
 .
 .

システムコールが何をするかはわかりません (通常、MIPS のコーディングはしません)。

ただし、条件、つまり $s0 と $tn のいずれかが等しいかどうかをチェックし、等しい場合は、ケースに適したルーチンにジャンプします。結構ですが、ルーチンはBEQ命令の直後にあるので、ここでは分岐はまったく不要です。さらに、条件が満たされない場合、プログラムは命令の直後のコードから続行しますBEQ

その結果、ルーチン (最小の ADDTN を追加) が無条件に実行されます。前述のように、システムコールが何をするのかはわかりませんが、追加が機能する場合、それらはちょっとしたジャンプか何かだと思います。

とにかく、テストされた条件の状態に応じてコードの別のブランチが実行されるように、コードを再配置する必要があります。これは一般的な「テンプレート」です。

        beq $s0, $t0, equal
        # this code is executed if $s0 and $t0 differ
         .
         .
        jmp notequal        # avoid also executing the code for equal
equal:
        # code for the case $s0 and $t0 hold the same value
         .
         .
notequal:
        # all that follows executes with no regard of the checked condition

あなたのようないくつかのケースを分岐するための手法は他にもありますが (4 つの操作をチェックする必要があるようです)、まず基本を理解し始める必要があります。

[更新: まあ、実際にはそれほど違いはありません。コード ブロックがより広く広がっているだけです... /update]

楽しむ...

于 2012-09-15T18:17:46.360 に答える