Если бы я делал это на языке более высокого уровня, я мог бы использовать либо рекурсии ...граф узлов в бинарном дереве с использованием MIPS ASM
size(node):
1 + size(node.left) + size(node.right)
или итерации ...
size = 0
stack = new Stack()
stack.push(root)
while(!stack.isEmpty()):
size++
node = stack.pop()
stack.push(node.left)
stack.push(node.right)
I Не знаю, с чего начать внедрять любой из них в сборке. Это похоже на язык высокого уровня, где рекурсия более изящна, но часто менее эффективна (без оптимизации хвостовой рекурсии)?
Должен ли я использовать стек, или я могу сделать это с помощью цикла, который только изменяет регистры? Мне нужно фактически подсчитывать узлы - не просто держать счетчик, как они добавлены.
Узлы хранятся в памяти с использованием двух указателей и значения данных, где указатели ссылаются на адреса памяти, хранящие дочерние элементы.
Я использую эмулятор QtSpim, если это имеет какое-то значение для подхода.
Кроме того, я не прошу заполненный код (если какой-либо код ...), как мне подойти к проблеме. Я знаю, как работает обход дерева, но я изо всех сил пытаюсь понять, как это делается в сборке.
Мой приоритет заключается в том, что каждый из них выполняется в сборке;) – Matt
Если бы я хотел изучить сборку MIPS, я бы использовал простейший подход, который не требует стека и рекурсии. Затем я бы использовал рекурсивный подход, так как он требует больше знаний: как вызвать функцию и т. Д. И последний подход, который я бы реализовал, был бы решением со стеком, поскольку он требует самых сложных операций с памятью. –