Путаница, связанная с виртуальной машиной в nand2tetris

Так что, проходя курс по nand2tetris, я застрял на этом вопросе.

В основном этот вопрос связан со сборкой виртуальной машины. Виртуальная машина очень похожа на JVM.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
392
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь нужно учитывать 2 основные части:

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

Это приводит к выводу, что SP после вызова foo, но до выполнения 1-й инструкции этой функции будет иметь значение 314.

Другие вопросы по теме