Здесь нужно учитывать 2 основные части:
call foo 2
: эта инструкция говорит vm вызвать функцию foo
, которая принимает 2 аргумента (которые должны быть помещены на вершину стека перед этим вызовом). function foo 4
: это НЕ первая инструкция в функции foo
, но тем не менее она влияет на SP, так как это означает, что функция foo
имеет 4 локальные переменные. И эти переменные должны где-то располагаться. Где? На вершине стека. Это означает, что до того, как будет выполнена первая «настоящая» инструкция foo
, мы должны поместить в стек 4 значения. Какие ценности? Что ж, в соответствии со спецификацией do vm это должно быть 0
, в результате чего локальные переменные инициируются в 0. Это также означает, что мы увеличиваем SP для каждой локальной переменной ( SP + 4)Это приводит к выводу, что SP после вызова foo
, но до выполнения 1-й инструкции этой функции будет иметь значение 314.