Что означает "возврат из подпрограммы"?
Я пытаюсь создать свой первый эмулятор CHIP-8 с нуля, используя C. При написании необходимого кода для инструкций я наткнулся на этот код операции:
00EE - RET
Return from a subroutine.
The interpreter sets the program counter to the address at the top of the stack, then subtracts 1 from the stack pointer.
( http://devernay.free.fr/hacks/chip8/C8TECH10.HTM)
Я знаю, что подпрограмма - это, по сути, функция, но что значит "вернуться" из подпрограммы? А что происходит с программным счетчиком, стеком и указателем стека соответственно?
(Еще один вопрос): Если я создал массив, который может содержать 16 значений для представления стека, будет ли "вершина стека" STACK[0] или STACK[15]? И где должен быть мой указатель стека?
1 ответ
Возврат из подпрограммы - это возврат выполнения кода к точке, в которой он находился до вызова подпрограммы.
Поэтому, учитывая, что вызов подпрограммы помещает текущий стек PC+2 (+2, чтобы перейти за инструкцию вызова) в стек. Возврат из подпрограммы вернет выполнение по адресу, который был помещен в стек путем извлечения адреса из стека. (например, pc=stack[sp]; sp-=2;)
Что касается дополнительного вопроса, это действительно зависит от того, определяете ли вы свой стек как восходящий или нисходящий. Для ЧИП-8 выбор не указан.