Непосредственное поле в lw
составляет 16 бит, да; и он подписан как дополнение к двум, поэтому возможный диапазон немедленных смещений равен -32768..32767, поэтому lw $s1, 15000($s0)
должно быть в порядке.
Поймите, что la
- это не настоящая инструкция MIPS. Скорее, он предписывает ассемблеру генерировать наиболее оптимальную последовательность команд, чтобы указанное вами непосредственное значение помещалось в указанный регистр. Таким образом, полный 32-битный диапазон значений может быть установлен с использованием la
, но обычно можно создать более оптимальный код, используя один раз la
, чтобы поместить подходящее значение в некоторый регистр, чтобы несколько последующих инструкций могли использовать немедленные смещения от этого значения, чем при использовании la
каждый раз, когда требуется немедленное значение.
Итак, предположим, что вам нужно загрузить значения из смещений 40000 и 50000 вашего массива, вы можете сделать:
array: .word 0:20000
~
la $s0, array # get address of array
la $s1, 40000 # get offset into a register
add $s0, $s0, $s1 # add offset to address, i.e. calculate (array+40000)
lw $s1, 0($s0) # fetch data from (array+40000)
lw $s2, 10000($s0) # fetch data from (array+40000+10000)