Сборка MIPS - изменение значения метки - PullRequest
0 голосов
/ 03 ноября 2010

Возможно ли в MIPS изменить во время выполнения значение метки или создать метку с определенным значением?

Я спрашиваю об этом, потому что при использовании инструкции lw $a0, label($s0) я хочу увеличить значениеметки +4 каждый раз, когда мы выполняем цикл, указывая новый адрес памяти массива.Я знаю, что могу сделать lw $a0, label+4($s0), но новое значение метки не будет сохранено.

Любой совет?

Ответы [ 2 ]

4 голосов
/ 03 ноября 2010

Нет.В MIPS вы должны иметь константу вне скобок при разыменовании (плохая формулировка).Если бы можно было изменить значение метки, то оно больше не было бы постоянным.Чтобы обойти это, вы могли бы вместо этого сделать что-то вроде

la $t1, label          #t1 holds address of label
add $t1, $t1, $s0      #t1 now holds address of label + s0 offset
lw $a0, 0($t1)         #load word from t1's location

addi $t1, $t1, 4       #t1 was incremented by 4 bytes now
lw $a0, 0($t1)         #load the next word

. Может быть целесообразно использовать addu, если s0 всегда будет неотрицательным.этикетка.Это исключительно псевдоним для места в памяти.В текстовом разделе это псевдоним позиции следующей инструкции.В разделе данных это псевдоним расположения в памяти следующего пространства.

0 голосов
/ 09 марта 2018

Я думаю, что ответ должен быть уточнен и дан ответ «Да».Я думаю, что произошла неправильная связь и путаница между «адресом» и «значением».

В настоящее время у меня есть массив, по которому я хочу перейти, чтобы выполнить пузырьковую сортировку.Чтобы узнать, когда остановиться, мне нужно значение индекса для сравнения с постоянной величиной массива.

Я создал метку arrayLength, и, увидев «нет» в этом ответе, застрялв течение 4 часов пытаясь изменить значение arrayLength на значение от пользователя, прежде чем я запомнил слово магазина sw.

Технически, да, вы не можете изменить базовый адрес массива, ноВы можете прочитать следующий следующий адрес.

Вот что вы можете сделать, чтобы получить длину массива для итерации по массиву с целым числом чтения:

li $v0, 5
syscall

.data
.word
.assign 2
arrayLength: 0

.text
sw $v0, arrayLength
lw $t0, arrayLength

На этом этапе arrayLength, определяемый пользователем, берется из $v0, помещается в arrayLength, затем сохраняется в $t0 из arrayLength и может использоваться для сравнения для перебора массива.

Другими словами, чтобы ответить на ваш вопрос, значение 0 в arrayLength было перезаписано (для нашего примера, скажем, 10).Так что да, вы можете перезаписывать этикетки весь день.Что вы не можете сделать, это изменить адрес этого ярлыка.

Насколько мне известно, после создания метки она присваивается адресу, и следующие адреса распределяются в зависимости от того, как вы ее идентифицируете (.byte, .half, .word и т. Д.),Оттуда, если нет какого-либо способа удалить метку и воссоздать ее, вы не сможете изменить адрес.Это вызвало бы МНОГО проблем с управлением памятью и было бы очень неэффективным и сложным без причины.


Теперь продолжим.Как примечание, если вы не знали, вы можете предопределить массив с помощью .space [number].Я думаю, что каждое значение по умолчанию 32 бита, так что 4 байта (слово).Поэтому, если вы хотите, скажем, 5 элементов (слов), вы сделаете 5 x 4, поэтому .space 20 и вы можете сохранить 5 слов в массиве.

В этом случае мы теперь предполагаем, что array уже создан и заполнен из нашего arrayLength из 10, и мы печатаем значение для каждого индекса следующим образом:

add $t1, $zero, $zero  #index value 0, our base address index

loop:

li $v0, 1
lw $a0, array($t1)
syscall

addi $t1, $t1, 4 #increase the address index by 4 (each index is 4 bytes long)
addi $t3, 1, $zero #increase the index identifier by 1
blt $t3, arrayLength, loop

#exit

Таким образом, индекс адреса ($t1) - это буквальное местоположение адреса.Каждый индекс, т.е. слово, имеет длину 4 байта (32 бита).Таким образом, наш $ t3 является идентификатором, который говорит (например): «Эй, мы находимся в позиции индекса 2 из 10», но в действительности мы находимся в адресе array + 8 из array + 40.

Вы могли бы, вероятно, вычислить идентификатор индекса и просто сделать $ t3 значением arrayLength x 4 и сделать blt $t1, $t3, loop.

Надеюсь, это поможет.

...