Создание (и доступ) к массиву в MIPS

Я пытаюсь создать массив в сборке MIPS, а затем добавить все элементы вместе. Однако, когда я пытаюсь собрать следующее, он говорит

Ошибка в read_array, строка 1, позиция 7: директива ".word" не может отображаться в текстовом сегменте. Сборка: операция завершена с ошибками.

Вот моя сборка:

list: .word 3, 2, 1, 0, 1, 2
li $t0, 0x00000000  #initialize a loop counter to $t0
li $t4, 0x00000005  #last index of array
li $t3, 0x00000000  #this will hold our final sum
la $t1, list  #the address of list[0] is in $t1

loop: addi $t0, $t0, 0x00000001 #index++
  add $t5, $t0, $t0 #array index X2
  add $t5, $t0, $t0 #array index X2 again
  add $t6, $t5, $t1 #4x array index in $t6

  lw $t2, 0($t6)   #load list[index] into $t2
  add $t3, $t3, $t2 #$t3 = $t3 + $t2
  beq $t0, $t4, end
  j loop

end:

Спасибо!


person hodgesmr    schedule 03.03.2010    source источник
comment
Я знаю о некоторых логических ошибках в этом коде, но я получил ответ на свой вопрос. Спасибо!   -  person hodgesmr    schedule 03.03.2010
comment
Это действительно странно, IDK, если это ограничение предназначено для защиты новичков от смешивания данных с кодом и сбоя их программы, когда выполнение попадает в их данные или что-то в этом роде. В большинстве ассемблеров вы можете использовать .byte / .word или db / dd где угодно, чтобы выдать любые байты, которые вы хотите, в любой позиции. (например, чтобы по какой-то причине выдать нестандартную кодировку инструкции.)   -  person Peter Cordes    schedule 05.12.2017


Ответы (2)


Вы должны поставить эту строку:

list: .word 3, 2, 1, 0, 1, 2

В раздел .data. Проверьте это краткое руководство.

person Carl Norum    schedule 03.03.2010
comment
Ссылка «Краткое руководство» отключена. - person ; 09.09.2019

Ошибка говорит вам, что вы не можете поместить данные (.word 3, 2) в сегмент кода. «Текстовый сегмент» — это термин в старом стиле, означающий «сегмент кода» http://en.wikipedia.org/wiki/Code_segment

Ассемблер хочет, чтобы вы объявили сегмент данных и поместили туда массив. Я никогда не делал ассемблер Mips, но я ожидал, что это будет что-то вроде этого

.data
list: .word 3, 2, 1, 0, 1, 2

.text
start:
li $t0, 0x00000000  #initialize a loop counter to $t0
li $t4, 0x00000005  #last index of array
li $t3, 0x00000000  #this will hold our final sum
la $t1, list  #the address o
person John Knoeller    schedule 03.03.2010
comment
Это было бы .text, а не .code в большинстве ассемблеров, которые я использовал. - person Carl Norum; 03.03.2010
comment
@Carl: ты, вероятно, прав, особенно с учетом сообщения об ошибке. Я изменю это. - person John Knoeller; 03.03.2010