Получение арифматической ошибки переполнения при вычислении среднего числа - сборка MIPS (MARS)!

Я пытаюсь получить в среднем десять чисел, введенных в массив. Я получаю арифметическое переполнение на add $a2, $a2, $a1.

Не уверен, что делаю не так. Помощь будет оценена.

Кроме того, я попытался переключить ограничение на 2 целых числа только потому, что оно не могло так быстро переполняться. Он складывает адреса вместо целых чисел. Это мое предположение, почему он все время переполняется. Но как мне изменить адреса на целые числа?

Вот мой код.

.data
  nums:
    .word   0,0,0,0,0,0,0,0,0,0
  prompt:
    .asciiz  "Please enter 10 positive integers:\n"
  avg:
    .asciiz "Avg = "
  result:
    .asciiz "      "

.text
.globl main
  main:
li      $v0, 4
la      $a0, prompt
syscall

li  $t1, 10
la  $a1, nums

getnums:  
addi    $t1, $t1, -1  
li  $v0, 5  
syscall

sw      $v0, ($a1)
addi    $a1, $a1, 4
bnez    $t1, getnums

#avg  
move    $a2, $zero  
move    $t0, $zero
addi    $a1, $a1, -4    
getavg:   
lw  $t0, 0($a1)  
addi    $t1, $t1, 1       
add $a2, $a2, $t0   #arithmetic overflow      
addi    $a1, $a1, -4  
bne     $t1, 10, getavg  

li      $v0, 4
la      $a0, avg
div $a2, $a2, 10 
syscall

la  $a0, ($a2) 
li  $v0, 1
syscall

li  $v0, 10
syscall

(Отредактировано для исправления форматирования кода - RobertB)


person Community    schedule 13.11.2013    source источник


Ответы (1)


Похоже, вы используете $a1 как указатель на текущее слово в памяти. Но когда вы делаете add $a2, $a2, $a1, вы добавляете содержимое регистра $a1, а не содержимое адреса памяти, на который он указывает. Не потребуется много циклов добавления 32-битного значения адреса памяти к самому себе, прежде чем вы столкнетесь с переполнением.

Недостающее звено - это инструкция Load Word, которая получит содержимое ячейки памяти:

lw $t0, 0($a1)

Это загрузит содержимое ячейки памяти, на которую указывает $a1, в $t0.

person RobertB    schedule 13.11.2013
comment
Куда именно вы бы это положили? Я пробовал перед переполнением, но, похоже, это не помогает. - person user2989270; 14.11.2013
comment
Это не просто вопрос вставки одной строчки кода. Вам нужно провести некоторую реструктуризацию вашего кода, чтобы вместо ссылки на $ a1 вы ссылались на $ t0 (в моем примере), который содержит содержимое адреса памяти, на который указывает $ a1. - person RobertB; 14.11.2013
comment
Это то, что я пытался сделать. : \ В течение нескольких часов, что бы я ни пытался, все, что я получаю, - это адрес вместо целого числа. - person user2989270; 14.11.2013
comment
#avg getavg: lw $ t0, 0 ($ a1) addi $ t1, $ t1, 1 add $ a2, $ a2, $ t0 # арифметическое переполнение addi $ a1, $ a1, 4 bne $ t1, 10, getavg div $ a2, $ t0, 10 li $ v0, 4 la $ a0, средний системный вызов li $ v0, 5 la $ a0, результат ($ a2) li $ v0, 1 системный вызов - person user2989270; 14.11.2013
comment
Могу я предложить вам вставить обновленный код в исходный пост в качестве редактирования? Ассемблер достаточно сложен, чтобы отлаживать по одной строке за раз! - person RobertB; 14.11.2013
comment
Обновлено, извините за это. - person user2989270; 14.11.2013
comment
Я не вижу $a2 инициализации. Может ли это быть проблема? - person RobertB; 14.11.2013
comment
переместить $ a2, $ ноль правильно? По-прежнему дает мне адресный номер. - person user2989270; 14.11.2013
comment
Когда я запускаю перерыв в инициализации a2 / t0, первое число, которое загружается в lw, - это цифры ascii в моей строке запроса Please. Итак, он начинается заново и заканчивается раньше. Если я ввожу 1-10 (с изменением кода на 10 цифр), я получаю «Пожалуйста, 10, .... 2». - person user2989270; 14.11.2013
comment
Я исправил ту часть, которую буду обновлять. Однако я все еще получаю средний адрес. - person user2989270; 14.11.2013
comment
При последнем системном вызове перед выходом из O.S. здесь он печатает адрес $ a0 вместо $ a2. - person user2989270; 14.11.2013
comment
Что ж, я думаю, что наконец-то все заработало правильно. Он напечатал 5, я попробовал все 100 и получил 100. Спасибо за ваше время. Это было очень оценено, теперь я должен попытаться заставить его вычислить max, min и распечатать входные данные, которые я уже перевернул в двоичные и шестнадцатеричные. - person user2989270; 14.11.2013