В то время как цикл в MIPS (новичок в MIPS)

#loops #assembly #while-loop #label #mips

Вопрос:

Я пытаюсь написать программу для вычисления nCr, где n и r вводятся пользователем. Мой подход заключается в следующем:

  1. Я прошу пользователя ввести значение n.
  2. Затем я прошу пользователя ввести значение r.
  3. Затем я вычисляю значение n-r.
  4. Затем, используя три цикла while, я вычисляю значение n! р! и (н-р)!
  5. Затем я делю на n! на r! и (n-r)!
  6. Затем я показываю его пользователю.
  7. Ниже приведен мой код:
     .data 
         prompt1: .asciiz "Enter the value of n:n"
         prompt2: .asciiz "Enter the value of r:n"
         message: .asciiz "The value of nCr is: "
    
     .text
          #Prompt the user to enter value of n
          li $v0,4
          la $a0,prompt1
          syscall
    
          #Get the value of n
          li $v0,5
          syscall
    
          #Store the value of n in $t0
          move $t0,$v0
    
          #Prompt the user to enter value of r
          li $v0,4
          la $a0,prompt1
          syscall
    
          #Get the value of r
          li $v0,5
          syscall
    
          #Store the value of r in $t2
    
    
          move $t2,$v0
    
          #Getting the value of (n-r)
          sub $t4,$t0,$t2
    
          #Calculating value of n!
          addi $t1,$zero,1
    
          while:
                blt $t0,1,exit
                mul $t1,$t1,$t0
                sub $t0,$t0,1
                j while
          exit:
                li $v0,10
                syscall
    
         #Calculating the value of r!
         addi $t3,$zero,1
    
         while:
               blt $t2,1,exit
               mul $t3,$t3,$t2
               sub $t2,$t2,1
               j while
    
          exit:
               li $v0,10
               syscall
    
         #Calculating the value of (n-r)!
         addi $t5,$zero,1
    
         while:
               blt $t4,1,exit
               mul $t5,$t5,$t4
               sub $t4,$t4,1
               j while
    
        exit:
              li $v0,10
              syscall
    
        #Getting the final value
        div $s0,$t1,$t3
        div $s1,$s0,$t5
    
        #Displaying the message
        li $v0,4
        la $a0,message
        syscall
    
        #Display the answer
        addi $a0,$s1,0
        syscall
     

Ошибка, которую я получаю, заключается в следующем:

  1. строка 46 столбец 6: метка «в то время как» уже определена.
  2. строка 46 столбец 6: метка «выход» уже определена.

Что я здесь делаю не так? Разве это не правильный способ использовать три цикла while в mips

Комментарии:

1. У вас не может быть трех глобальных символов с одним и тем же именем. Как ассемблер узнает, о каком из них вы говорите? Кроме того, как только вы покинете первый цикл, вы выполните системный вызов 10, который завершит программу. После этого больше ничего в вашей программе выполняться не будет.

2. Спасибо за предложение. Программа сейчас работает:)

Ответ №1:

Если вы пишете while: в своей программе, вы создаете метку с именем while , которая является псевдонимом для номера строки, в которой вы ее размещаете. В одном файле вы можете создать только одну метку с определенным именем.

Решением вашей проблемы было бы назвать ярлыки while1 , while2 и while3 . То же самое относится и к вашим exit этикеткам.

Комментарии:

1. Спасибо за ответ. Сейчас это работает:)

2. Другая стратегия состоит в том, чтобы попытаться придумать осмысленные названия для ваших этикеток , например n_fac: или r_loop: , вместо того, чтобы просто путать цифры. @anurag1905: Также обратите внимание, что x! / y! это prod(i=y..x) так ; вместо того, чтобы вычислять два огромных числа, а затем делить их, просто пропустите умножения, которые отменяют.

3. Отличное Предложение. Я буду иметь их в виду. Спасибо:)