Разработка алгоритма стека LIFO - PullRequest
3 голосов
/ 14 мая 2010

Я реализую виртуальную машину на основе стека, и я пытаюсь читать литературу, которая объясняет или излагает алгоритмы для работы со стеками, но безрезультатно. Вот пример:

int i = 3
int j = 4
int k = 5

Предположим, i, j и k - локальные переменные, поэтому они традиционно хранятся в стеке. Перевод ассемблера / байт-кода будет выглядеть примерно так:

pushi 3
pushi 4
pushi 5

И стек будет: 5 4 3

У меня есть целочисленный стек и стек строк, следовательно, pushi, однако мой вопрос заключается в том, чтобы не сохранять их в куче (с некоторым ptr* или буквенным идентификатором), как компилятор или интерпретатор узнает, что если хочу сделать что-то вроде int x = i + j после определения, я должен выскочить два и три раз соответственно , а также сделать все возможное, чтобы не потерять k (сохранить в регистр или что-то еще, а затем отправить обратно)?

Я надеюсь, что мой вопрос имел какой-то смысл, и, возможно, есть гораздо более умный подход: P Спасибо за понимание!

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

В этом случае компилятор захватывает кучу стекового пространства сразу, напрямую добавляя к указателю стека, а затем индексирует значения стека, не используя push и pop с обычными функциями чтения из памяти. Затем вычтите стек обратно к его первоначальному значению, когда закончите.

2 голосов
/ 14 мая 2010

Обычно это делается с помощью так называемого стека фрейма .Вы выделяете пространство для всех локальных переменных одновременно (переменные по модулю распределяются / оптимизируются в регистры), сохраняете базовый адрес этого блока и работаете от смещений оттуда.Затем вытолкните все из стека при выходе из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...