Изменить адрес памяти инициализированного слова сегмента.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] непосредственно, потому что это также постоянная времени соединения.

Другие вопросы по тегам