Операции со стеком возврата генерируют «недопустимый адрес памяти» в Gforth 0.7 - PullRequest
3 голосов
/ 29 октября 2011

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

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

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

Что я здесь не так делаю?

Ответы [ 3 ]

2 голосов
/ 31 октября 2011

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

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

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

1 голос
/ 23 октября 2014

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

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

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

, который должен дать вам

1 2 7 5
1 голос
/ 31 октября 2011

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

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

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

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

...