Сравните элемент массива.Смена оператора / если еще - Сборка - MIPS - PullRequest
1 голос
/ 14 сентября 2011

Это мой первый проект, извините за недостаток знаний, это код, который я пытаюсь воспроизвести.

   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».

Ответы [ 3 ]

1 голос
/ 14 сентября 2011
      # [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 означает регистр перехода, и он переходит на адрес, содержащийся в $t2 (который на данный момент содержит a[i], который здесь равен 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 голосов
/ 15 сентября 2011
.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 

Так что это работает не совсем так, как я хотел, но это работает, я хотел использовать jr в операторе switch, но я еще не совсем там.

0 голосов
/ 14 сентября 2011

Пампхаус: Прежде всего убедитесь, что вы хотите сделать, ваша программа не имеет правильной цели.
Все, хотя вы должны отметить некоторые моменты, такие как,

  • switch-case должен иметь значение "default", иначе он может создать большой проблема.
  • Переменные должны быть объявлены всегда в начале программы

  • не в цикле. переменные одного типа должны объявляться вместе.

...