MIPS ASM Домашнее задание - Массивы и циклы while - PullRequest
0 голосов
/ 06 февраля 2012

Во-первых, позвольте мне сказать это ... Я не хочу, чтобы кто-нибудь просто дал мне ответ ... Я бы хотел, чтобы меня указали в правильном направлении!

У меня есть массив целых чисел в этой программе .... например:

numbers:
     .word  17
     .word -50
     .word   1
     .word -999

У меня есть цикл while, который проходит через них и печатает каждый из них на новой строке. Это отлично работает. (-999 - конечный номер, и он не включен в распечатку)

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

Есть ли какой-нибудь способ найти адрес последнего элемента в массиве без предварительного цикла? Если нет, я могу сделать это так, как я упоминал, просто хочу убедиться, что я работаю настолько эффективно, насколько могу в программе.

Заранее спасибо!

1 Ответ

1 голос
/ 06 февраля 2012

Если вам разрешено выполнять любые приемы сборки, которые вы хотите, вы можете сделать что-то вроде

numbers:
 .word  17
 .word -50
 .word   1
last:
 .word -999

и использовать такой код, как этот псевдокод

for (ptr = last; ptr != numbers; ) print(*--ptr);

Другими словами, введитеметка и конец массива и идут назад, пока вы не достигнете начала массива, используя сравнение указателей вместо поиска терминатора (-999).

Или, чтобы избежать слишком большого изменения кодакак насчет

 .word -999
numbers:
 .word  17
 .word -50
 .word   1
last:
 .word -999

и идти назад, пока не найдете -999?

...