Ограничения памяти MIPS? - PullRequest
       9

Ограничения памяти MIPS?

5 голосов
/ 09 марта 2011

Я хотел бы спросить о доступе к памяти.Когда я выполняю команду load word, какие ограничения памяти существуют?Имеется в виду, какое наибольшее число я могу использовать в качестве смещения или базового регистра?

Регистры 32-битные, и, насколько я знаю, "непосредственный" - 16 бит.Таким образом, я почти уверен, что не могу сделать что-то вроде

array:  .word 0:20000
~

la     $s0, array
lw     $s1, 15000($s0)
...

Так что, если я хочу получить доступ к 15000, мне может понадобиться la что-то поменьше и продолжить, верно?Но какое меньшее значение мне нужно получить, чтобы быть в порядке и почему?

1 Ответ

2 голосов
/ 09 марта 2011

Непосредственное поле в 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)
...