Я думаю, что ответ должен быть уточнен и дан ответ «Да».Я думаю, что произошла неправильная связь и путаница между «адресом» и «значением».
В настоящее время у меня есть массив, по которому я хочу перейти, чтобы выполнить пузырьковую сортировку.Чтобы узнать, когда остановиться, мне нужно значение индекса для сравнения с постоянной величиной массива.
Я создал метку 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
.
Надеюсь, это поможет.