Что такое указатели?
Указатели - это то, что указывает на область памяти. Мы используем указатели для размещения значений в ячейках памяти. Например, в C:
int max;
int *ptr = &max;
*ptr = 22; // max = 22
В приведенном выше примере ptr указывает на ячейку памяти (max), и мы изменяем значение max на ptr
путем разыменования.
Как их правильно использовать в MIPS?
Чтобы понять это, вам нужно понимать синтаксис инструкции и какие операнды принимает каждая инструкция. Очевидно, мы не можем go выполнить все инструкции в одном ответе, поэтому я просто покажу вам несколько, чтобы вы поняли:
lw register, memory_location
sw register, memory_location
la register, memory_location
lw
загружает слово из памяти в регистр . Примеры:
lw $t0, first
lw $t0, ($t5) # this is like, int t0 = *t5
sw
сохраняет значение из регистра в ячейку памяти . Пример:
sw $t0, max # max = t1
sw $t0, ($t5) # *t5 = t0
la
загрузит адрес ячейки памяти в регистр.
la $t5, max # int *t5 = &max
Давайте теперь посмотрим на ошибки в вашем коде. Здесь:
lw $t5, max
Выше будет загружено значение max
в $t5
. Похоже, вы создали max
для хранения максимального значения. Загружать его здесь кажется бессмысленным, потому что он даже ничего не содержит. Вы хотите загрузить его адрес, используя la
:
la $t5, max #load address of max variable into $t5
Двигаясь дальше, мы видим эту инструкцию:
sw $t5, $t0
Это не будет собираться. Это приведет к ошибке. sw
имеет первый операнд (источник) как регистр, а второй операнд - это «ячейка памяти», а не регистр.
sw register, memory_location
Итак, если вы хотите что-то сохранить, вы должны:
sw $t5, ($t0) #store value inside $t5 at the 'address' inside $t0.
# Assume:
# $t5 = 23
# $t0 = 0x5555
# After executing this instruction, memory location 0x5555 would have value 23 in it
Это было просто объяснение. В приведенном выше коде вы присвоили $t0 = first
. Это даже не указывает на ячейку памяти! Однако $ t5 будет иметь ячейку памяти, если вы сделаете la $t5, max
.
Итак, я предполагаю, что вы хотели сделать:
sw $t0, ($t5)
# After executing this, 'max' == $t0 because $t5 is pointing at max.
Двигаясь дальше, мы видим:
bgt $t0, $t5, swapmax
Как вы уже догадались, это неверно. Причина: вы сравниваете «адрес» со значением. «Адрес» находится в $ t5, «Значение» - в $ t0. Если вы хотите получить значение внутри $ t5, вам нужно сначала загрузить его. Возможно, используя другой регистр:
lw $t3, ($t5)
#OR
lw $t3, max # same thing, $t5 is pointing at 'max'
Это очевидные ошибки. Возможны логические ошибки, но это ваш код и ваша программа, поэтому я оставлю вам изменять ваш лог c по мере необходимости