Я действительно думаю, что ответ должен быть уточнен и возвращен к «Да». Я думаю, что между «адресом» и «значением» возникла недоразумение и смешение.
В настоящее время у меня есть массив, в который я хочу перейти, чтобы сделать вид пузыря. Чтобы узнать, когда остановиться, мне нужно значение индекса для сравнения с длительностью массива, которая является постоянной.
Я создал 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
.
Надеюсь, это поможет.
Благодарим за редактирование и информацию, не пропустите голосования в 1 час. Голосов пока нет :) – Carlos
Нет проблем. Какой имитатор MIPS вы используете? Если вы используете MARS, вы можете видеть адреса памяти, используемые для замены ярлыков (в расширенной сборке) и почему они должны быть константой (иначе ассемблер не знал бы, что делать). – Kizaru
yep amateur using MARS, нормально плохое начало делать это :) – Carlos