User Tag List

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 41 по 50 из 58

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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ребята, вы вначале ТЗ составьте (убейте), а потом уже делите способ реализации (медведя). Я тут набор функций предлагаю, никто не поддержал, зато все ринулись в кодерство. Вначале думаем, потом кодим.
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

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

  3. #2

    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я написал свой интерпретатор. Стековый, но на этапе оптимизации стековые команды объединяются и рождаются безстековые операции. Дать его не могу, но могу помочь советами.

    Там получился такой набор команд:

    opCallFunction - вызвать стандартную функцию
    opCallMethod - вызвать метод класса
    opCall - вызов собственный метод (подпрограмму)
    opPushSelf - поместить в стек this (указатель на свой объект)
    opJmp - перейти на строку
    opLongJmp - перейти на строку и освободить стек
    opRet - завершить выполнение

    Далее обработка исключений.

    Для каждой команды указан адрес, куда следует перейти, если произошло исключение. А так же, что следует удалить из стека. После освобождения стека, в стек кладется объект Exception с описанием ошибки.

    И опкоды, которые используются только в блоках FINALLY..END или EXCEPT..END (catch...end):

    opTryFinallyEnd - если на верхушке стека лежит не NULL, то исключение. Иначе освободить стек.
    opThrow - сгенерировать исключение по объекту лежащему в стеке.
    opGetExceptionText - поместить в стек текст исключения из объекта лежащего в стеке.

    Далее идут команды для работы с типами данных VARIANT, OBJECT, INTEGER, FLOAT, BOOLEAN, STRING, CURRENCY ...

    Например набор команд для Integer:

    opPush_i - Поместить в стек непосредственное значение
    opPop_i - Освободить стек от Integer (увеличить указатель стека на sizeof(Integer))
    opPushVar_i - Из переменных в стек
    opPopVar_i - Сохранить из стека в переменные
    opPushObj_i - Из объекта в стек
    opPopObj_i - Из стека в объект
    opDup_i - Дублировать значение в стеке

    opAdd_i,opSub_i,opMul_i,opDivInt_i,opDiv_i,opMod_i ,
    opAnd_i,opOr_i,opXor_i,opCmpE_i,opCmpNE_i,opCmpL_i ,
    opCmpG_i,opCmpLE_i,opCmpGE_i,opCmpNEX_i,opNeg_i,
    opShl_i, opShr_i - эти команды производят операцию с парой чисел на верхушке стека так, что остается одно число.

    Да, а команда условного перехода всего одна. Она в наборе команд Boolean:

    opJt_b - Перейти, если TRUE.

    Но оптимизатор пораждает массу команд перехода. Например, opNeg_b + opJt_b заменяет на opJf_b

    В результате оптимизации может рождится команда типа:
    opPushVar_i_opPush_i_opCmpE_opJf_i(A, B, C)
    которая вообще не работает со стеком. Она выполняет действие
    if(variables[A] == B) ip += C;

    Или вот пример оптимизации получения элемента массива:
    opPush_i 0
    opPushObj_o номер
    opPushVar_i номер
    opCallMethod arrayOfInteger::getItem
    opPop_i
    opPop_o
    Заменяется на единственный опкод:
    opArrayOfIntegerGet_o_v(A,B)
    Который выполняет действие:
    ArrayOfInteger* a = objectVariables+A; if(B>=a->count) throw_bound(); *st++ = a->items[B];

    Эти все оптимизации ускоряют работу, но размер исходника интерпретатора занимает несколько сотен килобайт.
    Последний раз редактировалось vinxru; 12.01.2012 в 17:49.

  4. #3

    Регистрация
    17.05.2005
    Адрес
    г. Абакан
    Сообщений
    694
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Griv, это кто же это кинулся в кодерство? Я написал "от фонаря" байт код, типа с пояснениями, в стековой реализации, которая на мой, может быть не хужее "хипной". А ТЗ мы уже похерили, только вот медведь не делится на ноль, хоть тресни меня битой в лоб
    Уже несколько раз перечитал первый пост AlCo, возникло подозрение, что первоначальная мысль была отнюдь не за байт-код, а именно некоторое подобие муляции кода Z80 с возможностью дополнения новыми командами а-ля префикс типа неиспользуемого rst x.
    AlCo, выходи уже из раздумий, а то я пошел за варенным кофе!

  5. #4

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

    По умолчанию

    Цитата Сообщение от NovaStorm Посмотреть сообщение
    Код плотнее Z80 сделать будет трудно, над этим думали создатели и 8080, и Z80.
    Даже код калькулятора бейсика плотнее. См. питона в Info Guide #10.

    У меня пока идей нет. Байт-код явы мне весьма понравился.

  6. #5

    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А что бы и не JP (HL)? Да и это всё равно мелочи реализации.

  7. #6

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,870
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Oleg N. Cher, Идея неплохая
    рекомендую также посмотреть игру IronLord от UbiSoft

    Разумеется изнутри
    есть вероятность что либо Форт либо какой то свой язык
    С уважением,
    Jerri / Red Triangle.

  8. #7

    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    DI
    LD SP, ExecThread
    RET
    Вот подумалось тут ещё, а адреса-то должны быть виртуальными...
    Последний раз редактировалось NovaStorm; 13.08.2012 в 12:02.

  9. #8

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а сейчас это называется Return Oriented Programming и широко используется во взломах программ.

  10. #9

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,684
    Спасибо Благодарностей отдано 
    2,724
    Спасибо Благодарностей получено 
    172
    Поблагодарили
    132 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  11. #10

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вроде дошло, спасибо!
    Может тогда при разрешенных прерываниях в процедуре прерывания вначале сохранять кусок стека, а затем в конце перед выходом восстанавливать?

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя

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

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

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

Похожие темы

  1. ZXMAK2 - Виртуальная машина ZX Spectrum
    от ZXMAK в разделе Эмуляторы
    Ответов: 2230
    Последнее: 25.10.2025, 20:43
  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

Ваши права

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