Изменить адрес памяти инициализированного слова сегмента.data в MIPS
После инициализации слова внутри сегмента.data вот так:
.data
base: .word 0
Мне нужно изменить адрес, на котором сохраняется "base", внутри сегмента.text. Например, если "base" хранится в адресе "268501692", мне нужно изменить его на "268501700"
Как я могу это сделать?
1 ответ
Из вашего комментария:
Я в основном хочу выделить память через системный вызов 9 и записать адрес v0 (который является основой выделенного адресного пространства) в тег сегмента.data, а также иметь возможность манипулировать им впоследствии.
В терминах C, вы просите изменить адрес static int array[]
установить его на возвращаемое значение malloc
,
Это не так, как работают символы. При сборке и связывании они становятся фиксированными числовыми адресами. Там не происходит поиск таблицы символов, когда lw $t0, base($zero)
выполняется: инструкция машинного кода имеет адрес, жестко закодированный как непосредственная константа. См. Ссылку ISA MIPS для формата кодирования.
Вместо этого вам следует сохранить этот указатель в регистре или в фиксированной ячейке памяти, т.е. static int *pointer
, Тогда вам нужно только изменить значение указателя, он все еще имеет свой собственный адрес. Это дополнительный уровень косвенности над статическим массивом, но только если вы храните указатель в памяти. С указателем в регистре не имеет значения, указывает ли он на статический массив или на динамически распределенную память.
Не позволяйте синтаксису C обмануть вас: pointer[10]
выглядит так же, как array[10]
, но в случае указателя (с static
или глобальный pointer
переменная), компилятор должен выдать asm, который сначала загружает указатель из памяти, а затем разыменовывает его. Но в случае массива, адрес array
константа времени соединения, поэтому компилятор может array[10]
непосредственно, потому что это также постоянная времени соединения.