Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 18, 2024 14:07

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - CALL, RET, NEXT и адресный интерпретатор
Автор Сообщение
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
Можно сделать всегда первым словом (которое и вызывается CALL-ом) "интерпретатор последовательности адресов", тогда все будет единообразно, все слова получатся "ассемблерные".
Потери составят по одному адресу на каждое определение слова (на определение через DOES - 2 адреса). Но и это лучше, т.к. выходов из слова может быть больше одного (особенно если программировать в стиле Броуди).
Сообщение Добавлено: Вс апр 08, 2012 16:46
  Заголовок сообщения:  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 становится префиксной командой.
А в префиксном виде можно добавить и другие типы вызовов. Например, условный.

Хм... этак недалеко и до полнго превращения четырехбитной система команд в восьмибитную.
Сообщение Добавлено: Сб апр 07, 2012 04:22
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
А какие проблемы с возвратами?
Если слово ассемблерное, то оно вызывается через CALL и возвращает через RET.
Если слово "фортовое", то оно может вызываться через CALL, а в качестве возврата (ведь там ожидается адрес, да?) используется адрес слова (у Баранове-Ноздрунова оно называется EXIT), которое извлекает из стека адрес возврата (который там разместил CALL) и продолжает интерпретацию с этого адреса (= действие NEXT). Так было в Форте для K580. Подробно в книге "Язык программированния ФОРТ" описано.
Сообщение Добавлено: Пт апр 06, 2012 23:49
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
вопрос писал(а):
то нехорошо,если процессор "переходит к вычислению адреса перехода после выполнения слова",


Собственно, вычислять его и не надо. Его надо всего лишь брать из двух разных мест в зависимости от типа исполнения слова. А тип задается непосредственно при вызове.
Сообщение Добавлено: Пт апр 06, 2012 22:30
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
:zombypc; :zombypc;

Так... ловлю мыслю!.. Так как памяти у моего процессора сейчас всего 16Кx16, значит, два бита регистра PC "пропадают".
Их то и можно использовать для полезных функций...
Одна - старая - флаг переноса в 15-м бите регистра PC.
А вторая в 14-м бите может нести инфу о том, какой возврат ожидается, и определяется он при вызове подпрограммы.
Сообщение Добавлено: Пт апр 06, 2012 22:28
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
Собственно, количество ... логических единиц при анализе этого механизма настолько невелик, что можно сметь надеяться сделать даже исчерпывающий перебор при поиске нужного решения.
Понятно, что от слова к слову минимально ведёт команда перехода, поэтому самое простое - находить адрес перехода во время компиляции (подумаешь - задача :?: ) и просто прыгать. Однако - вложенность, т.е. стек возвратов, таким образом неизбежным представляется RET.
То есть, мы выбираем между прыжком (по разному оформленным) и прыжком ... а ведь тоже прыжком. Итак - перед нами на самом деле 2 прыжка - только разный механизм получения адреса. В общем случае можно исходить из следующего - прыжок будет происходить непременно, но способ вычисления (получения) адреса - неодинаков.

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

Дажее понятно, что если речь о скорости, то нехорошо,если процессор "переходит к вычислению адреса перехода после выполнения слова", желательно, чтобы адрес уже был вычислен.
3 варианта
А) адрес вычисляется во время компиляции если возможно
В) адрес вычисляется параллельно выполнению слова
С) ничего не получается - смириться - адрес придётся вычислять отдельно
Сообщение Добавлено: Пт апр 06, 2012 21:52
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
mOleg писал(а):
не мешать одно с другим, если слово завершается RET, а не NEXT вызывать его с помощью CALL. А вообще, совмещение методик вызова страшный изврат, имхо.


CALL-ом вызываются оба способа... да, изврат, но так есть...
Сообщение Добавлено: Пт апр 06, 2012 21:23
  Заголовок сообщения:  Re: CALL, RET, NEXT и адресный интерпретатор  Ответить с цитатой
WingLion писал(а):
По сему и возникает вопрос - КАК?

не мешать одно с другим, если слово завершается RET, а не NEXT вызывать его с помощью CALL. А вообще, совмещение методик вызова страшный изврат, имхо.
Сообщение Добавлено: Пт апр 06, 2012 17:42
  Заголовок сообщения:  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, а при возврате каким-то образом определять, какой это тип возврата - возврат в код или возврат в адресный интерпретатор...

По сему и возникает вопрос - КАК?
Сообщение Добавлено: Пт апр 06, 2012 17:31

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB