Сначала создайте массив - например, глобальный массив объявлен в разделе .data
с использованием метки и резервирования памяти, возможно, с помощью .space 40
, чтобы зарезервировать 10 слов памяти. Если массив находится после строк (для подсказок и распечаток), используя .align 2
перед глобальным массивом, чтобы убедиться, что массив правильно выровнен в памяти.
.data
...
.align 2
array: .space 40
Мы также можем использовать динамическое c хранилище для массива через системный вызов 9, sbrk
или используйте пространство стека, опуская указатель стека.
Во-вторых, мы делаем ссылки на массив, вычисляя адрес интересующего элемента и используя загрузку или сохранение для этот адрес. Интересующий адрес можно вычислить по формуле array + index * scale
, где scale
- размер в байтах элементов массива (т.е. 4 для массивов слов). Например, предположим, что индекс массива i находится в регистре $t0
, и мы хотим сослаться на массив [i]. Умножение на 4 (что является второй степенью двойки) выполняется с помощью инструкции сдвига.
la $t1, array # load base address of the array into $t1
sll $t2, $t0, 2 # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
lw $t3, ($t2) # fetch from memory the value referred to by address in $t2
или для присваивания аналогично просто измените загрузку на хранилище, например array [i] = t3
la $t1, array # load base address of the array into $t1
sll $t2, $t0, 2 # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
sw $t3, ($t2) # store value into memory at array[i]
Используйте эти последовательности внутри al oop, который увеличивает индекс, т.е. Обратите внимание, что мы можем хранить адрес массива в регистре на время l oop, поэтому псевдо-инструкция la
может находиться до и за пределами l oop.
Мы можем также используйте указатели вместо индексации. Для этого измените регистр, который ссылается на массив. Вместо того, чтобы каждый раз вычислять array + index * scale
, увеличивайте регистр, здесь $t0
, на 4 в теле l oop, чтобы указать на следующий элемент в массиве.
loop:
...
lw -or- sw $t3, ($t0)
...
addiu $t0, $t0, 4
...
j loop
другие части корпуса l oop должны будут выполнять операции запроса и ввода данных пользователем.