Операции возврата стека генерируют неверный адрес памяти в Gforth 0.7

Я изучаю Форт здесь, и я добрался до операций возврата стека.

Итак, используя консоль в Ubuntu 11.04 x64, я пытаюсь получить TOS в стеке возврата, но это происходит:

1 2 3 4 5 ok
>r 
:36: Invalid memory address
>R>>><<<
Backtrace:

Что я здесь делаю неправильно?


person Pepe    schedule 29.10.2011    source источник
comment
У вас есть непревзойденный >r с r>, так чего же вы ожидаете? Вы не должны так играть со стеком возврата. (По крайней мере, это то, что я собрал.)   -  person Andriy M    schedule 31.10.2011


Ответы (3)


>r само по себе является словом и должно быть возвращено интерпретатору. Когда >r выполняется, как в вопросе, он добавляет новый обратный адрес, недопустимый.

Вместо этого используйте >r внутри (нового) слова. Обратите внимание, что элементы, добавленные в стек возврата, должны быть удалены до того, как это слово закончится — стек возврата должен быть в том же состоянии, в котором слово начало выполняться.

Циклы на самом деле являются примером применения стека возвратов внутри слов (поэтому ваше собственное использование стека возвратов также должно быть сбалансировано внутри циклов точно так же, как оно должно быть сбалансировано внутри слова).

person Peter Mortensen    schedule 30.10.2011

То, что вы пытаетесь сделать, на самом деле не имеет большого смысла. Четвертая машина выполняет серию слов, адрес следующего слова в строке, которое должно быть выполнено, хранится в специальном регистре с именем NEXT (подумайте об этом как об указателе инструкций ЦП).

Стек возврата необходим, потому что, если обращение к слову, которое само является цепочкой слов, в конечном итоге приведет к очистке исходного адреса в регистре NEXT — чтобы этого не произошло, текущее содержимое регистра NEXT помещается в стек возврата.

Если я правильно понимаю, >r помещает верхний элемент застрявших данных в стек возврата; в этом случае «5» недействителен, потому что по адресу «5» нет инструкций.

Как заметил кто-то другой, вам не нужно беспокоиться о стеке возврата, если только вы не реализуете новые конструкции управления.

person wmercer    schedule 31.10.2011
comment
Стек возврата можно использовать для временного хранения данных во время выполнения слова. Иногда это может упростить код, который в противном случае был бы очень сложным, используя только один стек данных. - person Peter Mortensen; 31.10.2011

Вы можете использовать стек возврата в Gforth в командной строке (это нестандартная функция), с одним ограничением: он должен быть сбалансирован в пределах одной строки. В конце строки интерпретатор строки собирается вернуться, и поэтому стек возврата должен содержать ожидаемый адрес возврата.

Итак, попробуйте что-то вроде

1 2 3 4 5 >r + r> .s

что должно дать вам

1 2 7 5
person forthy42    schedule 22.10.2014