Помните, что инструкции CALL
и RET
используют тот же стек, что и PUSH
и POP
. Если RET
не возвращает обратно, это означает, что стек каким-то образом был изменен.
Каждая PUSH
операция должна иметь один и только один соответствующий POP
в каждом возможном пути потока между обычной точкой входа и RET
.
В вашем примере PUSH
es и POP
s не сбалансированы. Например:
push n ; push n onto the stack
pop n ; pop n off the stack
Почему оно лопнуло сразу после того, как его нажали? В чем причина?
BRNE notZero ; if RO is >0 jump to nonZero
...
notZero:
pop R0 ; pop R0
, если BRNE
происходит, этот pop
извлекает данные, которые никогда не передавались, т.е. перемещает указатель стека за пределы адреса возврата.
push n ; push n onto stack
push R0 ; push r0 onto stack
для чего эти два push
es?
et c. На самом деле есть много проблем с вашим кодом. Просто внимательно проверяйте все возможные потоки.
А также совет: никогда не используйте рекурсию для того, что можно сделать простым l oop. Такие как факторные вычисления.