#loops #assembly #while-loop #label #mips
Вопрос:
Я пытаюсь написать программу для вычисления nCr, где n и r вводятся пользователем. Мой подход заключается в следующем:
- Я прошу пользователя ввести значение n.
- Затем я прошу пользователя ввести значение r.
- Затем я вычисляю значение n-r.
- Затем, используя три цикла while, я вычисляю значение n! р! и (н-р)!
- Затем я делю на n! на r! и (n-r)!
- Затем я показываю его пользователю.
- Ниже приведен мой код:
.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
Ошибка, которую я получаю, заключается в следующем:
- строка 46 столбец 6: метка «в то время как» уже определена.
- строка 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. Отличное Предложение. Я буду иметь их в виду. Спасибо:)