2011-09-14 16 views
1

これは私の知識の不足で申し訳ありませんが、これは私が複製しようとしているコードです。配列要素を比較します。 switch文/その他の場合 - アセンブリ - MIPS

int A[3] = {0, 1, 2}; 
    int x; 
    for (int i = 0; i < 3; i++) 
    { 
     if (A[i] > 1) 
     x = 1; 
     else 
     { 
       switch (A[i]) 
       { case 0: 
         x = 2; 
        case 1: 
         x = 3; 
       } 
     } 
     printf(“%d”, x); 
} 

これはアセンブリのコードです。

main: li $s0, 0 
      sw $s0, ($s7) #int A[0] = {0}; 
      li $s0, 1 
      sw $s0, 4($s7) #int A[1] = {1}; 
      li $s0, 2 
      sw $s0, 8($s7) #int A[2] = {2}; 
      li $s1, 1 #initialize x = 1 
      li $s0, 0 #initialize i = 0 
      li $s2, 3 # constant 3 
      li $s3, 1 # constant 1 


    start: blt $s0, $s2, for 
      j finish 

    for: add $t1,$s0,$s0 #reg $t1 = 2*i 
      add $t1,$t1,$t1 #reg $t1 = 4*i 
      add $t0,$t1,$s7 

    bgt $t0, $s3, exone #a[i] is greater than 1 how to increment the array up? 
    #switch statement 
    lw $t0, 0($t1) 
    jr $t0 
    j start 

     L0: add $s0, $s0, 1 
      li $s1, 2 
      j print 

     L1: add $s0, $s0, 1 
      li $s1, 3 
      j print 


     exone: add $s0, $s0, 1 
      li $s1, 1 
      j print 


     print: li $v0, 1 # print integer 
      move $a0, $s1 # what to print is stored at $s1 
      syscall 
      j start 



     finish: li $v0, 10 # exit system call 
       syscall 

は、私はそれがコンパイルされますが、私が欲しいの出力またはそのことについては任意の出力を与えるものではありません間違ったつもりだどこか分かりません。

いくつかの情報に基づいて私は自分のコードを更新しました。

main: add $s0,$zero, $zero 
     li $s7, 200 
     sw $s0, 0($s7) #int A[0] = {0}; 
     addi $s0, $s0, 1 
     sw $s0, 4($s7) #int A[1] = {1}; 
     addi $s0, $s0, 1 
     sw $s0, 8($s7) #int A[2] = {2}; 
     li $s1, 0 #initialize x = 0 
     li $s0, 0 #initialize i = 0 
     li $s2, 3 # constant 3 
     li $s3, 1 # constant 1 

    #check to enter the for loop 
    for: blt $s0, $s2, enter 
       j finish 
    #enter the for loop 
    enter: add $t1,$s0,$s0 #reg $t1 = 2*i 
      add $t1,$t1,$t1 #reg $t1 = 4*i 
      add $t0,$t1,$s7 #reg A[i] 
      lw $t2, 0($t0) 
      bgt $t2, $s3, exone #a[i] is greater than 1 check 
      #switch statement 
      jr $t2 
      #just in case jump back to for loop 
      j for 

      #address for the switch statements 
     L0:  add $s0, $s0, 1 
       li $s1, 2 
      j print 

     L1:  add $s0, $s0, 1 
      li $s1, 3 
      j print 
     #address for the if else statement 
     exone: add $s0, $s0, 1 
      li $s1, 1 
      j print 


    print: li $v0, 1 # print integer 
     move $a0, $s1 # what to print is stored at $s1 
     syscall 
     j for 



    finish: li $v0, 10 # exit system call 
      syscall 

出力は「231」である必要があります。

+0

1) 'swtich'を' break'なしにしたいと思っていますか? 2) 'bgt $ t0、$ s3、exone'は*アドレス*と&a [i]'を '1 'と比較します。 3) 'jr $ t0'は間違っています(もしあなたがジャンプテーブルをコードしようとしているのなら、これは方法ではありません)。 – user786653

+0

大丈夫何をお勧めしますか?私はコードを更新し、より読みやすくし、提案に基づいています。 – Pumphouse

答えて

1
 # [snip] 
     add $t0,$t1,$s7 #reg A[i] 
     lw $t2, 0($t0) 
     bgt $t2, $s3, exone #a[i] is greater than 1 check 
     #switch statement 
     jr $t2 

これはjrはジャンプの登録を意味間違っている、それはここでは0、1または2であり、この時点でa[i]が含まれています($t2に含まれているアドレスにジャンプ - にジャンプしないように偉大アドレス)。

あなたはこれを修正するために多くのことを行うことができます(私はあなたのCコードでbreak文を持っているためのものと仮定します)が、ここではif文のセットでスイッチを模倣するいくつかの簡単なテストされていないコードです:

は、
li $t3, 0 
beq $t2, $t3, L0 # if (a[i] == 0) goto L0 
li $t3, 1 
beq $t2, $t3, L1 # if (a[i] == 1) goto L1 
j print # else fall through 
0

Pumphouse: まず、あなたのプログラムは適切な目的を持っていないことを確認してください。あなたのようないくつかの点に注意する必要がありますけれども
はすべて、

  • スイッチの場合は、それ以外の場合は、大きな 問題を作成することも、「デフォルト」を持っている必要があります必要があります。
  • 変数は、ループ内のプログラム

  • ないの上に常に宣言する必要があります。同じ型の変数を一緒に宣言する必要があります。

+0

あなたの入力に基づいて自分のコードを修正しようとしました。どのようにswitch文にデフォルトのcaseを追加しますか?学校のスライドの例がありますが、デフォルトのケースはありません。 – Pumphouse

0
.data 
array: .word 0 : 3 
.text 
.globl main 


main: la $s7, array 
     add $s0, $zero, $zero 
     sw $s0, 0($s7) #int A[0] = {0}; 
     addi $s0, $s0, 1 
     sw $s0, 4($s7) #int A[1] = {1}; 
     addi $s0, $s0, 1 
     sw $s0, 8($s7) #int A[2] = {2}; 
     add $s1, $zero, $zero #initialize x = 0 
     add $s0, $zero, $zero #initialize i = 0 
     li $s2, 3 # constant 3 
     li $s3, 1 # constant 1 

#check to enter the for loop 
for: blt $s0, $s2, enter 
     j finish 
#enter the for loop 
enter: add $t1,$s0,$s0 #reg $t1 = 2*i 
     add $t1,$t1,$t1 #reg $t1 = 4*i 
     add $t0,$t1,$s7 #reg A[i] 
     lw $t2, 0($t0) 
     bgt $t2, $s3, exone #a[i] is greater than 1 check 
#switch statement I would like to know how to properly do this with a jr 
     beq $t2, $zero, L0 
     beq $t2, $s3, L1 
#just in case jump back to for loop 
     j for 

#address for the switch statements 
    L0: add $s0, $s0, 1 
     li $s1, 2 
     j print 

    L1: add $s0, $s0, 1 
     li $s1, 3 
     j print 

    #address for the if else statement 
    exone: add $s0, $s0, 1 
     li $s1, 1 
     j print 


print:  li $v0, 1 # print integer 
     move $a0, $s1 # what to print is stored at $s1 
     syscall 
     j for 



finish: li $v0, 10 # exit system call 
     syscall 

だから、これはそれが私はそれをやってみたかった正確にどのようにではなかった動作しますが、それは私がswitch文でJRを使用していた作品が、私はまだかなりありませんよ。

関連する問題