Задачата е по дадено листо от дървото, да се намери следващото листо. Ако няма следващо, зарежда първото, тоест върти в кръг. Ако дървото има само един елемент, връща него.
Структурата на дървото е в двойно свързан списък със следене на началото и на края:
struct TObject
.__parent dd ? ; родителски елемент
.__first_child dd ? ; начало на списъка с дъщерни елементи
.__last_child dd ? ; край на списъка с дъщерни елементи
.__next dd ? ; следващ елемент
.__prev dd ? ; предишен елемент
ends
Измислих супер код от 12 инструкции с използването само на един регистър:
; EAX == начален елемент
.next:
cmp [eax+TObject.__next], 0
cmovne eax, [eax+TObject.__next]
jne .down_to_leaf
cmp [eax+TObject.__parent], 0
cmovne eax, [eax+TObject.__parent]
jne .next
.back_to_first:
cmp [eax+TObject.__prev], 0
cmovne eax, [eax+TObject.__prev]
jne .back_to_first
.down_to_leaf:
cmp [eax+TObject.__first_child], 0
cmovne eax, [eax+TObject.__first_child]
jne .down_to_leaf
; EAX == следващ елемент.