2017-02-04 2 views
0

Это моя первая попытка MIPS, и я разработал псевдокод описания возможного алгоритма. Контуры код выглядит следующим образом:Как создать программу, которая найдет сумму целых чисел от 1 до N, где N - значение, считанное на клавиатуре?

main: Print: "Please input a value for N =" 
read v0 
If(v0 >0) 
{ 
    t0 = 0 
    while(v0 > 0) do 
    { 
    t0 = t0 + v0 
    v0 = v0 +v0 -1 
    } 
print: The sum of integers from 1 to N is = ", t0 
go to main 
} 
else 
    print: "Honest Abe" 

так, с этим контуром, я сделал несколько в попытке перевести это в MIPS, но целых переменных, хранящих и читать их в заблуждение меня. Моя попытка реального кода:

.data 
    Prompt: .asciiz "\n Please input a value for N=" 
    Result: .asciiz "\n The sum of integers from 1 to N is " 
    Bye:  .asciiz "\n ***Honest Abe***" 

.text 
    main: 
     li $v0,4    #load $v0 with print_string code 
     la $a0, Prompt   #load $a0 with the message to be displayed 
     syscall 

     bgz $v0, else 
     li $t0, 0 
     while: 
       bgz $v0 
       add $t0,$t0,$v0 
       addi $v0,$vo -1 

Отсюда, я не понимаю, как для петель работать в MIPS и я не понимаю, если это даже правильный подход. Вся идея чтения в цифрах и последующего хранения целых чисел не обрабатывается в моей голове. Кроме того, я не уверен, что я использую соответствующие команды для цикла. Помогите с любым из этих вопросов было бы здорово!

+0

Один способ создать цикл для MIPS делает прыжок на метку без условия (J время). Другой - цикл с условием, использующим команды 'slt' и' beq', или просто 'bgt' для' while (v0> 0) '. – Coursal

+0

Ну, во-первых, вам не нужен цикл, так как уравнение для арифметического ряда равно (n/2) * (n min + n max), поэтому в вашем случае (считая от 1) это (n/2) * (1 + п) –

ответ

0

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

Вы можете вычислить сумму до определенного числа с помощью простого цикла. Как и в C:

scanf("%d", &num); 
for(i=0;i<num;i++) 
sum=sum+i; 

как массив. С небольшой помощью эталонной карты MARS, вы можете в конечном итоге с чем-то вроде этого:

.text 
main: 

li $v0, 5 #read a number from the keyboard 
syscall 

addi $s0, $v0, 1 #s0= the number from the keyboard + 1 (the limit) 

li $t0, 1  #counter set to 1 

loop: 
    beq $t0, $s0, exit  #if the counter becomes equal tothe limit, exit the loop 

    add $t1, $t1, $t0  #add the counter to the sum to this point 

    addiu $t0, $t0, 1  #add 1 to the counter for each loop 

j loop      #go to the "loop" label above 

exit: 

li $v0, 1 
move $a0, $t1 
syscall 

li $v0, 10 
syscall