2011-09-14 21 views
1

這是我的第一個項目對於我缺乏知識抱歉,這是我試圖複製的代碼。比較數組元素。切換語句/如果其他 - 大會 - 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意味着跳轉註冊並跳轉到此時包含a[i]包含在$t2(地址,在這裏是0,1或2 - 不要妄下很大的地址)。你可以做很多事情來糾正這個問題(我假設你的意思是在你的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

泵站: 首先確定你想做什麼,你的程序沒有任何正確的目標。
所有但你應該注意的一些點狀,

  • 的switch-case應該必須有「默認」,否則可能會帶來一個很大的問題 。
  • 變量應該總是在程序

  • 不在循環的頂部聲明。同一類型的變量應該一起聲明。

+0

所以我試圖根據您的輸入修復我的代碼。你將如何在switch語句中添加一個默認情況。我在學校有幻燈片的例子,但他們沒有默認情況。 – 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,但我還沒有應用。