pop R1
pop R2
add R1, R2
push R1
ret
Ваша подпрограмма забывает, что инструкция JSR
поместила адрес возврата в стек! Инструкция POP R1
не возвращает полезный операнд. Вместо этого он возвращает адрес возврата.
Более того, инструкция RET
больше не будет возвращаться ниже инструкции JSR
.
Следующий код извлечет правильные значения из стека:
load R2, SP
inc R2
load R1, (R2) ; This is the 3 in your example
inc R2
add R1, (R2) ; This adds the 5 in your example
ret
и помещает ответ обратно в стек.
Это означает замену 2 значений выше отправленного адреса возврата значением 1 ,Далее один из способов сделать это:
store R1, (R2) ; Replace input value 5 by the sum 8
pop R1 ; Pop the return address
pop R2 ; Remove the input value 3
push R1 ; Put the return address back
ret ; ... so RET can use it correctly