MIPS Bad Address в стеке данных - PullRequest
0 голосов
/ 19 сентября 2018

Я только начинаю в MIPS.У меня есть следующее назначение:

Подсчитать количество кратных X в данном массиве из 8 неотрицательных чисел, где X - выбранное пользователем значение степени двух, например, 1, 2, 4, 8,….

Введите необходимый код для:

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

b.Подсчитайте количество кратных X в массиве A и выведите результат на экран.

Для этого набора входных данных, приведенных в коде, я пытаюсь получить вывод:

2
3

Однако у меня возникает следующая ошибка: «Неверный адрес в данных / стекечитать: 0x00000090 "

Я использую симулятор QTSpim, и это информация о сегменте данных.Могу ли я узнать, как 0x00000090 не является ячейкой памяти первого элемента массива, к которому я пытаюсь получить доступ?Этот код может не достичь желаемого результата, потому что я застрял на этой стадии отладки.

enter image description here

# arrayCount.asm
  .data 
arrayA: .word 11, 0, 31, 22, 9, 17, 6, 9   # arrayA has 8 values
count:  .word 999             
char: .ascii "\n"

  .text
main:
    # code to setup the variable mappings
    la $t0, 144 #map arrayA
    la $t8, 146 #map count

    # code for reading in the user value X
    li  $v0, 5
    addu $a1, $v0, -3 
    syscall

    #start printing out the stored int here 
    li  $v0, 1
    addu $a0, $a1, $zero
    syscall

    #print newline character(Assuming string)
    li  $v0, 4
    la  $a0, char
    syscall

    #to set the higher bound to do a while loop
    li  $a0, 8
    addi $t2, $zero, 0 


    # code for counting multiples of X in arrayA


loop:
    slt $t1, $t2, $a0
    beq $t1, $zero, exit

    sll $t3, $t2, 2
    add $t4, $t3, $t0
    lw $t5, 0($t4)
    and $t6, $t5, $a1

    beq $t6, $zero, skip
    addi $t8, $t8, 1

skip:
    addi $t2, $t2, 1 
    j loop    

exit:

    # code for printing result

    li  $v0, 1
    addu $a0, $t8, $zero
    syscall

    # code for terminating program
    li  $v0, 10
    syscall
...