Forth
http://fforum.winglion.ru/

CALL, RET, NEXT и адресный интерпретатор
http://fforum.winglion.ru/viewtopic.php?f=56&t=2833
Страница 1 из 1

Автор:  WingLion [ Пт апр 06, 2012 17:31 ]
Заголовок сообщения:  CALL, RET, NEXT и адресный интерпретатор

Стандартный вызов подпрограмм в процессоре превращается в вызов адресного интерпретатора, если каждую подпрогрaмму заканчивать не командой RET, а командой NEXT, которая при исполнении делает RET и сразу же новый CALL без выборки опкода.

Форт-Программа с прямым шитым кодом превращается в код:
Код:
    CALL word1
    DW word2,word3,word4...
    DW word_next

word_next: RDROP NEXT


Возникает некоторая проблема при необходимости вызвать форт-слово в коде на ассемблере.
Для него приходится делать обертку в виде

Код:
    CALL word
    label1
label1: RET ; - эквивалент ;CODE


Чтобы расточительства такого не было, надо все слова заканчивать командой RET, а при возврате каким-то образом определять, какой это тип возврата - возврат в код или возврат в адресный интерпретатор...

По сему и возникает вопрос - КАК?

Автор:  mOleg [ Пт апр 06, 2012 17:42 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

WingLion писал(а):
По сему и возникает вопрос - КАК?

не мешать одно с другим, если слово завершается RET, а не NEXT вызывать его с помощью CALL. А вообще, совмещение методик вызова страшный изврат, имхо.

Автор:  WingLion [ Пт апр 06, 2012 21:23 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

mOleg писал(а):
не мешать одно с другим, если слово завершается RET, а не NEXT вызывать его с помощью CALL. А вообще, совмещение методик вызова страшный изврат, имхо.


CALL-ом вызываются оба способа... да, изврат, но так есть...

Автор:  вопрос [ Пт апр 06, 2012 21:52 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

Собственно, количество ... логических единиц при анализе этого механизма настолько невелик, что можно сметь надеяться сделать даже исчерпывающий перебор при поиске нужного решения.
Понятно, что от слова к слову минимально ведёт команда перехода, поэтому самое простое - находить адрес перехода во время компиляции (подумаешь - задача :?: ) и просто прыгать. Однако - вложенность, т.е. стек возвратов, таким образом неизбежным представляется RET.
То есть, мы выбираем между прыжком (по разному оформленным) и прыжком ... а ведь тоже прыжком. Итак - перед нами на самом деле 2 прыжка - только разный механизм получения адреса. В общем случае можно исходить из следующего - прыжок будет происходить непременно, но способ вычисления (получения) адреса - неодинаков.

Вот эти два различных способа нужно соспоставить и проанализировать.

Дажее понятно, что если речь о скорости, то нехорошо,если процессор "переходит к вычислению адреса перехода после выполнения слова", желательно, чтобы адрес уже был вычислен.
3 варианта
А) адрес вычисляется во время компиляции если возможно
В) адрес вычисляется параллельно выполнению слова
С) ничего не получается - смириться - адрес придётся вычислять отдельно

Автор:  WingLion [ Пт апр 06, 2012 22:28 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

:zombypc; :zombypc;

Так... ловлю мыслю!.. Так как памяти у моего процессора сейчас всего 16Кx16, значит, два бита регистра PC "пропадают".
Их то и можно использовать для полезных функций...
Одна - старая - флаг переноса в 15-м бите регистра PC.
А вторая в 14-м бите может нести инфу о том, какой возврат ожидается, и определяется он при вызове подпрограммы.

Автор:  WingLion [ Пт апр 06, 2012 22:30 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

вопрос писал(а):
то нехорошо,если процессор "переходит к вычислению адреса перехода после выполнения слова",


Собственно, вычислять его и не надо. Его надо всего лишь брать из двух разных мест в зависимости от типа исполнения слова. А тип задается непосредственно при вызове.

Автор:  in4 [ Пт апр 06, 2012 23:49 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

А какие проблемы с возвратами?
Если слово ассемблерное, то оно вызывается через CALL и возвращает через RET.
Если слово "фортовое", то оно может вызываться через CALL, а в качестве возврата (ведь там ожидается адрес, да?) используется адрес слова (у Баранове-Ноздрунова оно называется EXIT), которое извлекает из стека адрес возврата (который там разместил CALL) и продолжает интерпретацию с этого адреса (= действие NEXT). Так было в Форте для K580. Подробно в книге "Язык программированния ФОРТ" описано.

Автор:  WingLion [ Сб апр 07, 2012 04:22 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

in4 писал(а):
А какие проблемы с возвратами?


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


in4 писал(а):
которое извлекает из стека адрес возврата (который там разместил CALL) и продолжает интерпретацию с этого адреса (= действие NEXT).


А когда слово вызвано из ассемблера, надо, чтобы действие было = RET, а не NEXT, т.е. после извлечения адреса возврата происходило не продолжение интерпретации с того места, а возврат к исполнению кода и продолжение.
Решение в лоб означает, что ассемблерный вызов слова будет не просто
Код:
CALL addr,

а
Код:
    CALL addr,
    exit


в котором
Код:
: exit RDROP RET ;

вызов "распухает" почти в 2 раза, и это не нравится.

По сути, надо делать два разных CALL один для вызова интерпретатора, другой для ассемблерного вызова.
т.е. CALL^ret и CALL^next
И где-то запоминать способ вызова.
Наиболее приемлемо - на стеке возвратов и запоминать - в том бите адреса возврата, который не существенен для исполнения программы, когда в системе мало памяти.

CALL становится префиксной командой.
А в префиксном виде можно добавить и другие типы вызовов. Например, условный.

Хм... этак недалеко и до полнго превращения четырехбитной система команд в восьмибитную.

Автор:  in4 [ Вс апр 08, 2012 16:46 ]
Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор

Можно сделать всегда первым словом (которое и вызывается CALL-ом) "интерпретатор последовательности адресов", тогда все будет единообразно, все слова получатся "ассемблерные".
Потери составят по одному адресу на каждое определение слова (на определение через DOES - 2 адреса). Но и это лучше, т.к. выходов из слова может быть больше одного (особенно если программировать в стиле Броуди).

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/