Получение суммы четных чисел (от 1-10) из массива MIPS

#arrays #mips

#массивы #mips

Вопрос:

Я новичок в MIPS, и я немного обескуражен, это моя первая задача в этом, и я уже чувствую, что застрял. Кажется, я не могу найти проблему.

 .data
    myArray: .space 40
.text
    #For later to check if the number is even 
    addi $s2, $zero, 2

    #values for the array
    addi $t0, $zero, 1
    addi $t1, $zero, 2
    addi $t2, $zero, 3
    addi $t3, $zero, 4
    addi $t4, $zero, 5
    addi $t5, $zero, 6
    addi $t6, $zero, 7
    addi $t7, $zero, 8
    addi $t8, $zero, 9
    addi $t9, $zero, 10

    #initial index
    addi $s1, $zero, 0

    #putting the values in an array
    sw $t0, myArray($s1)
        addi $s1, $s1, 4
    sw $t1, myArray($s1)
        addi $s1, $s1, 4
    sw $t2, myArray($s1)
        addi $s1, $s1, 4
    sw $t3, myArray($s1)
        addi $s1, $s1, 4
    sw $t4, myArray($s1)
        addi $s1, $s1, 4
    sw $t5, myArray($s1)
        addi $s1, $s1, 4
    sw $t6, myArray($s1)
        addi $s1, $s1, 4
    sw $t7, myArray($s1)
        addi $s1, $s1, 4
    sw $t8, myArray($s1)
        addi $s1, $s1, 4
    sw $t9, myArray($s1)
        addi $s1, $s1, 4

    #cleaning
    addi $s1, $zero, 0
    addi $s0, $zero, 0

    loop:
        beq $s1, 40, exit
        addi $s1, $s1, 4


        lw $s3, myArray($s1)



        div $s3, $s2
        mfhi $s4

        beqz $s4, true


        j loop
    true:
        add $s0, $s0, $s3
        j loop
    exit:
        move $a0, $s0
        syscall
  

Я был бы очень признателен за помощь в решении этой проблемы, а также за некоторые предложения по более глубокому пониманию mips и источников для изучения.
Заранее благодарю вас.

Ответ №1:

Вы не говорите, в чем «проблема».

По какой-либо причине вы не начинаете с массива, в котором уже есть данные?

 myArray:  .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  

Вам нужно установить основную метку

   .text
  .globl main

 main:

  # the code
  

Для цикла проверки, является ли его четным:

 loop:
    beq $s1, 40, exit
    addi $s1, $s1, 4
  

Это увеличит s1 на 4 перед его использованием, поэтому вы не получите первое значение. поэтому необходимо переместить часть добавления на after, где вы получаете текущее значение массива.

Для проверки, является ли оно четным, или можно было бы выполнить и нижнего бита значений — если установить его нечетным, в противном случае его событие

Итак

 div $s3, $s2
mfhi $s4
  

может быть изменено на

 and $s4, $s3,