Важная информация

User Tag List

Страница 1 из 6 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 58

Тема: Нужна виртуальная машина на ZX

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Нужна виртуальная машина на ZX

    Предлагаю всем вместе поломать головы над виртуальной машиной для Z80. Задачи, которые стоят:
    1. Код плотнее, чем на Z80.
    2. Перемещаемость (помогло бы для ОС с одним окном памяти, где код лежит внизу).
    3. Реентерабельность (опять-таки для ОС).
    4. Возможность использования ассемблерных вставок с ограничениями.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran Аватар для Raydac
    Регистрация
    16.08.2005
    Адрес
    Estonia,Tallinn
    Сообщений
    1,128
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    179 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    виртуальная машина для Z80 что бы плотнее перемещаемее и реентабельность это уже придумано более 30 лет назад )) называется FORTH и пишется за пару дней и есть все перечисленное )))
    p.s.
    правда что бы на FORTH программить надо мыслить в обратной польской записи )))
    p.p.s.
    Иван Макарченко в остаток альтеры в спринтере forth-процессор зашивал насколько помню

  4. #3
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Трезвой форт-машины для Z80 не знаю. Покажите процедуру NEXT.

  5. #4
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,598
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alone Посмотреть сообщение
    Трезвой форт-машины для Z80 не знаю. Покажите процедуру NEXT.
    Есть одна идея, как можно реализовать наиболее быстрый вариант виртуальной машины на Z80 — может и не по всем пунктам, обозначенным топикстартером, но вариант интересный. Судите сами.

    Это аналог Форт-машины с прямым шитым кодом. Подпрограммный шитый код мы не рассматриваем, потому что это фактически подмножество машинного кода, просто организованный массив подпрограмм со своей логикой.

    1. Код плотнее, чем на Z80.

    Отчасти, да. Интересные вещи писали авторы отечественных Форт-систем о компактности фортовского шитого кода, который превосходил реализации с машинным кодом.

    2. Перемещаемость (помогло бы для ОС с одним окном памяти, где код лежит внизу).

    Нет, потому что код шитый. Или разве что да, но будет требоваться простая настройка адресов, что не должно вызвать проблем.

    3. Реентерабельность (опять-таки для ОС).

    Вероятно, это можно реализовать.

    4. Возможность использования ассемблерных вставок с ограничениями.

    Безусловно.

    Прямой шитый код Форт-машины — это последовательность адресов вызываемых подпрограмм на Форте или в машинном коде. Для Z80 может выглядеть примерно так:

    Код:
    DW LITERAL_BYTE ; Заносим на стек
    DB 5 ; число 5
    DW DUP ; Дублируем значение на стеке
    DW MULT ; Умножаем само на себя (возводим в квадрат)
    DW EMIT ; Печать числа
    Вероятно, большой проблемой будет слово NEXT, от которого сильно зависит скорость работы всей машины. (NEXT передаёт управление следующему за текущим словом. Вероятно, имеет смысл модифицировать шитый код для большей производительности слова NEXT, если это вообще возможно. Моё предложение имеет один минус, который многим покажется критичным. Тем не менее, всё-таки посмотрите, что предлагается.

    Код:
    DI
    LD SP, ExecThread
    RET
    
    DW EMIT ; Адреса слов потока исполнения, но в обратном порядке
    DW MULT
    DW DUP
    DB 5
    DW LITERAL_BYTE
    ExecThread: ; Сюда устанавливается верхушка стека
    В такой реализации словом NEXT в шитом коде будет адрес, указывающий на RET (и обычный RET в машинных подпрограммах). Не все проблемы решены. Остаются трудности с вложенными вызовами шитого кода из шитого кода (или из машинной подпрограммы) — нужно куда-то сохранить адреса возврата. Значит нужен стек, притом не SP, ибо он активно занят другими делами. Если вложенность гарантированно будет одинарная (ну, такой гипотетический случай), должно хватить одного регистра под это. Например, IY.

    Теперь о самом главном минусе. Это конечно запрещённые прерывания. Не вижу способа их разрешить. Полумерой предлагаю лёгкую подпрограмму, которую можно будет вручную вызывать время от времени из своих подпрограмм.

    Плюсы решения: при запрещённых прерываниях не нужно на них отвлекаться процу — код будет работать быстрее. Второй плюс — такая машина может быть регистровой, а не стековой, как Форт. И параметры будут передаваться в регистрах.

    Практическое применение этой идее наверно найти трудно, но вдруг у кого-то появится мысль как её усовершенствовать.

    P.S. На законченность концепции не претендую — так, сырая идея.

  6. #5
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,057
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Олег, данная концепция именно в том виде, как вы описали, используется в ксорке-защите от Max Iwamoto. Можно посмотреть во многих его Cracktro к играм. На стеке лежала куча адресов, каждый из которых указывал на коротенькую подпрограмму, заканчивавшуюся, как правило, командой RET.

    Максом Ивамото, конечно, преследовалась цель не уплотнить код, а запутать его. Но эта задача не была им решена. Стоит только разобраться с основной идеей, что на стеке расположена фактически программа из инструкций, семантика которых задается лежащими на стеке адресами подпрограмм - как все становится понятно, а изучающий эту защиту получает чувство глубокого удовлетворения от знакомства с красивой концепцией и легкостью, с которой он ее взломал. Каждой "инструкции" присваивается мнемоника, потом адреса подпрограмм заменяются на эти мнемоники - и вуаля, программа как на ладони. Там и циклы были, и условные переходы и, конечно же, регистр R.

  7. #6
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Код:
    DI
    LD SP, ExecThread
    RET

    DW EMIT ; Адреса слов потока исполнения, но в обратном порядке
    DW MULT
    DW DUP
    DB 5
    DW LITERAL_BYTE
    ExecThread: ; Сюда устанавливается верхушка стека

    Теперь о самом главном минусе. Это конечно запрещённые прерывания. Не вижу способа их разрешить. Полумерой предлагаю лёгкую подпрограмму, которую можно будет вручную вызывать время от времени из своих подпрограмм.
    А почему прерывания должны быть запрещены?
    *(Извините, если что, башка от жары перестала варить)

  8. #7
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    А почему прерывания должны быть запрещены?
    Потому, что SP указывет тут не на стек, а на программу. Если возникнет прерывание, программа испортится (будет записан адрес возврата).
    И кстати, "Адреса слов потока исполнения" должны быть как раз в прямом порядке. RET увеличивает указатель SP.

  9. #8
    Veteran Аватар для Raydac
    Регистрация
    16.08.2005
    Адрес
    Estonia,Tallinn
    Сообщений
    1,128
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    179 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    >>Покажите процедуру NEXT.
    если это насчет моей поделки, то там нет и не может быть процедуры NEXT, это не эмуль JVM это транслятор JVM байт кода напрямую в команды Z80
    а так и FORTH ведь есть без NEXT, когда в прямой код компилится

  10. #9
    Activist
    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    233
    Спасибо Благодарностей отдано 
    81
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    19 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    alone, а цели какие? Виртуальная машина для чего? Чтоб исполнять результат трансляции какого-то собственного языка с ассемблерными вставками?
    Кроме п.1 из перечисленных не вижу зачем нужна именно виртуальная машина. П. 2 - вопрос дизайна/реализации загрузчика/OS, п. 3 - вопрос реализации того куда нужна эта реентерабельность , п.4 - в том же LLVM это более чем предусмотрено (см. http://blog.llvm.org/2010/04/intro-t...c-project.html про "Compiler-Integrated Assembler")

    Я к тому что для достижения п.1 (для всего остального ВМ не обязательно) с помощью LLVM можно сделать решение еще лучше.
    Можно сделать сначала просто бэкенд (таргет) для Z80, а затем на основе него сабтаргет (subtarget) с дополнительным набором "инструкций" (для экономии памяти), генерирующий прологи/эпилоги для нативного кода и т.п. + виртуальную машину для исполнения результата. (кстати, можно еще для всяких акселераторов и т.п. псевдоинструкции делать )
    В результате можно получить не "виртуальную машину с возможностью использовать ассемблерные вставки", а компилятор чего угодно в желаемый байткод в перемешку с нативным кодом (т.е. когда ради "кода плотнее" нет смысла использовать байткод, компилятор может генерить нативный код), ну и возможность использовать ассемблерные вставки никуда не денется. Если хочется еще какой-то свой язык специфичный, фронтэнд можно сделать.

    Документации (и кода, т.к. не поспевает документация за изменениями), конечно, дофигища придется перечитать. Я читал/копался немного, голова кругом идет от объема информации, но могу сказать что штука очень хорошо задизайненная и крайне гибкая. Всем желающим делать какие либо виртуальные машины для чего угодно, компиляторы или JIT-ы (или все сразу), категорически рекомендую Отличный framework для всех перечисленных целей (и более того).

    Инструкция по разработке backend-ов: http://llvm.org/docs/WritingAnLLVMBackend.html
    Примеры реализации см. в исходниках в llvm/lib/Target (X86, естественно, самый вылизанный бэкенд на данный момент)
    Последний раз редактировалось mastermind; 08.01.2012 в 19:53.

  11. #10
    Veteran Аватар для Raydac
    Регистрация
    16.08.2005
    Адрес
    Estonia,Tallinn
    Сообщений
    1,128
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    179 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    на местном форуме я уже лет семь и могу сказать что тут всегда есть только одна проблема ))) куча народа предлагает какое то клевое решение или идею но никто (!) не догадывается что можно это запрограммить и показать как макет )))

Страница 1 из 6 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. ZXMAK2 - Виртуальная машина ZX Spectrum
    от ZXMAK в разделе Эмуляторы
    Ответов: 1974
    Последнее: 07.03.2024, 23:45
  2. Машина Тьюринга для Z80
    от ZXMAK в разделе Эмуляторы
    Ответов: 4
    Последнее: 15.08.2011, 03:26
  3. Продвинутая Мелко Машина 1
    от Black_Cat в разделе Зарубежные компьютеры
    Ответов: 74
    Последнее: 03.03.2009, 09:05
  4. Что за машина такая??? Commodore 128...
    от ILoveSpeccy в разделе Commodore 16/64/128
    Ответов: 5
    Последнее: 31.10.2007, 10:25
  5. Java-машина
    от Error404 в разделе Программирование
    Ответов: 2
    Последнее: 15.01.2007, 15:11

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •