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

User Tag List

Страница 8 из 10 ПерваяПервая ... 45678910 ПоследняяПоследняя
Показано с 71 по 80 из 99

Тема: Вызов функций через RST

  1. #71
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    Ну раз требують %)
    В виде своих десяти копеек предлагаю прямые call на адреса функций системы, патчуемые (во словечко!) при загрузке программы.
    Отличия от кернельного метода (набор jp по фиксированным адресам)
    - 2 байта на адрес точки входа (которые меняются от версии к версии) против 3 байтов
    Для "библиотеки" -- да.

    - 2 байта на каждый call в настраиваемой программе. для последующей настройки. в дальнейшем эта память может использоваться под свои нужды (можно не считать)
    - несколько сотен(?) байт на настройщик (проигрыш)
    Если в ROM-диск (маленький...)? И потом настраивать надо
    абсолютно все программы. Через JP xxxx вызовы "библиотеки"
    загруженной по абсолютному адресу (например, вызовы подпрограмм
    ПЗУ) настраивать не надо.

    Кроме того, ещё один ньюанс. Допустим, "библиотекой" реализуется
    некий "драйвер" устройства. Например, HDD. Загрузил, пропатчил --
    работай. Хорошо. А КАК БЫТЬ, КОГДА В ОДИН КОМПУТЕР НУЖНО
    ЗАГРУЗИТЬ НЕСКОЛЬКО ТАКИХ "ДРАЙВЕРОВ"? Вот тут вся технология ломается. В варианте с JP xxxx на это есть два выхода:

    1) для переключения между разными "библиотеками" просто
    копируется массив JP xxxx целиком поверх текущего
    используемого. Медленное переключение, быстрый вызов.

    2) вызов по методу вызова виртуальных функций, я как-то писал.
    Вызов медленный (100 тактов), переключение времени не
    отнимает.

    Выигрываем 10 тактов на выполнение каждого вызова и проигрываем несколько сотен(?) тактов на настройщик (один раз за всю работу программы)
    В качестве компромисса я бы предложил в качестве базового
    варианта всё-таки JP xxx. Экономия байта из двух на десятках
    "библиотечных" функций многого не отнимет. А кому нужно очень
    быстро могут поверх этого реализовывать вариант с прямым
    вызовом. Наоборот тоже можно было бы, но это сложней получается
    и ОЗУ больше нужно.

  2. #72
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,255
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    82
    Поблагодарили
    35 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fk0
    Всё релоцируемое -- обязательно двухбайтовое. Да и вопрос в
    том, как потом отличить CALL xxx на библиотеку от адресов,
    сменившихся в результате сдвига начального адреса? Одни
    вопросы.
    не факт! можно делать релоцируемые однобайтовые точки. в который раз уже даю ссылку на свою работу на эту тему. все прекрасно работает и достаточно универсально. http://zxdocs.fatal.ru/coding/module.zip

    Цитата Сообщение от fk0
    Для "библиотеки" -- да.
    не только. программа от библиотеки по большому счету ничем не отличается.

    Цитата Сообщение от fk0
    Если в ROM-диск (маленький...)? И потом настраивать надо
    абсолютно все программы. Через JP xxxx вызовы "библиотеки"
    загруженной по абсолютному адресу (например, вызовы подпрограмм
    ПЗУ) настраивать не надо.
    вызовов функций пзу (в смысле кода) не так уж и много. гораздо чаще эти вызовы происходят. да и компрессию еще никто не отменял...

    короче, все упирается в приоритет- скорость работы или размер. в зависимости от этого и надо выбирать вариант. предложенный с самопатчением по таблице jp объединяет все худшие черты обоих методов %)

  3. #73
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    не факт! можно делать релоцируемые однобайтовые точки. в который раз уже даю ссылку на свою работу на эту тему. все прекрасно работает и достаточно универсально. http://zxdocs.fatal.ru/coding/module.zip
    Опять разбираться в ассемблере... Кратко можно, на макросах?

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


    короче, все упирается в приоритет- скорость работы или размер.
    в зависимости от этого и надо выбирать вариант. предложенный с самопатчением по таблице jp объединяет все худшие черты обоих методов %)
    RST vs CALL? Смешно. Экономия байта на вызов. И потеря
    сотни тактов. Равно как и CALL прямой vs через JP. Экономия
    10-и тактов в подпрограмме съедающей сотни-тысячи не менее смешна. Зато геморою с компиляцией выше крыши. Не все ж в
    аласме пишут. И готовые программы адаптировать невозможно практически (ну оно конечно придёт опять к варианту с JP xxxx).

    Я считаю JP xxxx -- это хороший метод. Причём, обязательно,
    когда оно в ОЗУ. В ПЗУ тоже, конечно, работает, но возможности
    уже не те. Для библиотек загружаемых в ОЗУ массив JP xxxx всё
    равно с программой таскается, так никто его не мешает и таскать
    для ПЗУшного варианта. Причём полностью, все функции. Что
    это даёт: настройка на ПЗУ посредством LDIR'а из ПЗУ в этот
    же массив в ОЗУ. И дальше самое интересное: возможность создания функций-фильтров для библиотечных функций (трассировка
    вызовов, например, и прочий хакинг).

  4. #74
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,255
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    82
    Поблагодарили
    35 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fk0
    Опять разбираться в ассемблере... Кратко можно, на макросах?
    там на них родимых все и сделано...

    Цитата Сообщение от fk0
    Равно как и CALL прямой vs через JP. Экономия
    10-и тактов в подпрограмме съедающей сотни-тысячи не менее смешна. Зато геморою с компиляцией выше крыши.
    экономия 10 тактов на каждый вызов! а трата сотни-тысячи тактов один раз за запуск. вот из этих соображений и следует выбирать между скоростью и размером. про рст и речи не идет- слишком тормозно и слишком мало преимуществ.

    Цитата Сообщение от fk0
    Я считаю JP xxxx -- это хороший метод. Причём, обязательно,
    когда оно в ОЗУ.
    в таком случае проще вытянуть таблицу подстановочных точек как в методе пропатчения. меньше места занимать будет, а патчер и так в пзу может лежать.

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

    По умолчанию

    Цитата Сообщение от fk0
    Для ALASM -- да. Мне не нравится. Сильно список адресов для
    патча большой получается. И потом в таком варианте не реализуется
    функция-фильтр (когда в JP xxxx подсовывается её адрес вместо
    действительного).
    Не такой уж и большой - она в памяти после трансляции программы по заданным адресам будет занимать 0 (ноль) байт памяти - она просто напросто не нужна после трансляции.
    Та структура, которую лоббирует витамин обладет кроме того что нет проблем с вызовами и кучей других преимуществ.

    Кроме того, указанная таблица для преобразования вызовов функций из Call 0 в Call <ClrScr> обладает значительно большей скоростью и помехазащищённостью - потому что в ПЗУ Call <Адрес> с последующим JP <внутри_ПЗУ> всегда будет работать, а вот если вдруг версия ПЗУ не та? Вопрос отслеживания типов функций их номеров, отслеживания изменения их от версии к версии повергнет в ужаc самого автора треда и он на самом дела на медленный RST подсядет

    А вот если будет модуль как у витамина, то программа просто напросто не запустится - ПЗУ выдаст ошибку "неверный номер функции" и например предложит прервать работу.

    А теперь вот такой вопрос на засыпку - кто из писателей программ не делел такую п/п
    _LDIR_ LDIR
    RET

    ?

    И после этого ктото будет говорить что это неэффективно?

    Именно таких фрагментов кода, которые вообще то уже есть в ПЗУ не надо будет вставлять в свою программу - они так же будут вызываться CALL <> но для этого надо будет сделать соответствующую настройку, а она делается только один раз!!!

    А сколько раз в программе такое запускается? Не один десяток, точно знаю! очистка экрана, переброс экрана, переброс других областей и т.д. и т.п. - это всё ЕСТЬ в ПЗУ, но этим мало кто пользуется потому что появляется зависимость от версии ПЗУ - в 82м ПЗУ одни точки, в 90м - другие, да мало ли программа нарвётся на какую нить версию ПЗУ кривую. Именно потому ДО СИХ ПОР версии ПЗУ почт не менялись - по крайней мере менялись такие части, которые бы минимально меняли структуру кода ПЗУ - TR-DOS как был кривой так наверное таким и останется, как был кривой БЕЙСИК 48 так таким и останется.

    С системой патчей "на лету" кода всё просто - меняем систему ПЗУ - меняем в ней же точки трансляции (т.е. на что нужно подменять тот или иной Call или Jp) - и колбасим версию ПЗУ хоть как - хоть суём её часть с теневое ПЗУ хоть запаковываем его и при Reset раскаковываем в память - при "патче" программы она всё равно вызовет то что надо откуда надо а никак не приведёт к сбросу или какому нить ещё иррациональному поведению.
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

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

    Thumbs up И ещё,

    даже 10 прямых вызовов через Call может уже привести к выигрышу по сравнению с системой Call на Jp.

    А если их много? А если их очень много?

    И вообще, ещё раз - сам процесс "пропатчивания" по сравнению с временем загрузки программы (которое обязон есть) - порядка 5-10% (для средних исполнительных файлов - для игр и дем эта цифра будет значительно меньше) - т.е. вы загрузили программу, у вас ещё флопарь не перестал крутиться а программа уже настроена - остались только прямые Call и никакой таблица в памяти уже нет - чистейшая программа.

    После этого ВСЕ функции выполняются быстро - потому что нет никаких дополнительных переходов и т.д.

    Т.о. своя оценка (плюсом обозначаю достоинства минусом недостатки):

    1. RST - слишком медленно(-) хотя может показаться удобным(+) - на каждый вызов требуется порядка 200(-) тактов (может и чуть быстрей) на определения куда прошёл вызов; может возвратиться с ошибкой(+) - если нет заданной функции. Использовался в старых программах как наследие системы прерываний от PC-шных монстров. Требуется меньше всего памяти для вызова(+) - около 3х байт, позволяет растаскивать процедуры по ПЗУ как угодно, внутренний транслятор адресов сам всё вычислит и сделает(+). Поддерживается всеми компиляторами ассемблера(+).

    2. Метод установленных точек перехода - Jp (Call) на таблицу Jp внутри ПЗУ - требуется порядка 5-6 байт из программы (-), но работает очень быстро(+) по сравнению с предыдущим вариантом. Тратится условно 20/26 тактов на один вызов процедуры. Передача параметров (загрузка регистров) требует дополнительных(-) вложений (где-то до 50 тактов максимум), от компилятора требуется согласованность с версией ПЗУ (-), потому что прямой вызов/перезод на ПЗУ может привести к фатальному исходу(?-), практически невозможно контролировать "неправильные" вызовы/переходы(-). Требуется дополнительная таблица в ПЗУ(-). Поддержка компиляторами легко реализуется(+).

    3. Метод прямого вызова с предварительной настройкой. Подразумевает наличие в файле таблиц для коррекции адресов вызовов(-) - что требует дополнительного места на носителе (4 байта на каждую точку). Требует предварительной настройки (-), порядка 100 тактов на одну точку вызова, однако настройка идёт только один раз(?+), больше она не выполняется. Требует 5-6 байт для своей работы(-). Скорость выполнения вызова самая высокая(+) - быстрей просто не бывает - 10/16 тактов. Загрузка регистров параметрам увеличивает(-) время вызова и память отводимую для вызова условно до 40 тактов. Имеется возможность отследить неверный вызов(+) ещё на этапе настройки вызовов - контролируются "неправильные переходы". Требуется дополнительная таблица в ПЗУ(-). Непростая реализация компиляторов - далеко не все существующие компиляторы способны генерировать соответствующий код(-).

    Я для себя выбрал третий вариант, а Вы?
    Последний раз редактировалось GriV; 05.12.2005 в 18:43. Причина: Добавил кой чего
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

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

  8. #77
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GriV
    Не такой уж и большой - она в памяти после трансляции программы по заданным адресам будет занимать 0 (ноль) байт памяти - она просто напросто не нужна после трансляции.
    Та структура, которую лоббирует витамин обладет кроме того что нет проблем с вызовами и кучей других преимуществ.
    У ней функциональности нет, а не проблем нет. Проблемы у неё
    начинаются прямо с ассемблера. Я, например, такой код никаким
    C-компилятором сгенерировать не могу, и я это знаю. Нужно будет
    писать свой ассемблер для трансляции такого кода -- вот это
    проблема. В ALASM можно макросами. А как быть кто пользуется
    GENS? А как быть с существующим кодом? Под него писать
    обёртку вокруг всё того же JP xxx.

    Это может быть хорошее решение для решения какого-то узкого круга специфических задач, где жалко каждые 10 тактов. В качестве
    более общего, применимого в любой области, в любом направлении,
    решения оно непригодно. Хотя бы из-за технических трудностей,
    в настоящее время не решённых и решать их просто некому. И некогда.

    Кроме того, указанная таблица для преобразования вызовов функций из Call 0 в Call <ClrScr> обладает значительно большей скоростью и
    Значительно большей -- это, если грубо, примерно, 10/1000, а
    то и 10/10000 -- 0.1..1% экономии по времени. И где-то
    чуть по-больше по памяти, процентов 5 может быть. Несомненно,
    это ЗНАЧИТЕЛЬНО большая скорость...

    помехазащищённостью - потому что в ПЗУ Call <Адрес> с последующим JP <внутри_ПЗУ> всегда будет работать, а вот если вдруг версия ПЗУ не та?
    Условимся, что БАЗОВЫЙ ИНТЕРФЕЙС ПЗУ вот такой-то. ОН НЕ МЕНЯЕТСЯ. Все последующие интерфейсы наследуются от базового, следовательно сохраняют функциональность предыдущих версий.
    Осталость ввести функцию VERSION в базовый интерфейс.

    Кому-то может нужно большего. Изобретайте COM под спектрум.

    Вопрос отслеживания типов функций их номеров,
    Я не знаю как можно трактовать понятие типа функции в
    машинном коде. Функция это не болеe чем лишь какой-то код.
    Равно как и в ассемблере.

    отслеживания изменения их от версии к версии повергнет в ужаc самого автора треда и он на самом дела на медленный RST подсядет
    Видно большого знатока. А ты пробовал? А я пробовал. Никаких проблем нет. Единожды пишется "заголовочный" файл:

    Код:
    function_name:
            jp function_number
    function_name:
            jp function_number
    function_name:
            jp function_number
            ...
    Всё. Новые функции при необходимости добавляются только в конец. Нумерация исключительно последовательная. Авторам софта выдаётся этот самый заголовочный файл. Никакой ручной работы по отслеживанию чего-то нет вообще.

    А вот если будет модуль как у витамина, то программа просто напросто не запустится - ПЗУ выдаст ошибку "неверный номер функции" и например предложит прервать работу.
    Откуда в команде CALL xxx возьмётся неверных номер функции?
    Оно может возникнуть только на этапе настройки программы на адреса библиотечных функций. Ну так это сообщение возникнет в любой системе, если такая возможность предусмотрена. Можно, например, указывать общее число функций. Можно в интерфейсе самую первую функцию выделить для реализации функций получения информации об интерфейсе и возможного переключения интерфейсов (по примеру COM). Последний вариант даже лучше.

    Только, насколько я понимаю, Vitamin использует не номера, а имена функций.

    А теперь вот такой вопрос на засыпку - кто из писателей программ не делел такую п/п
    Код:
    _LDIR_ LDIR
    RET
    ?
    И после этого ктото будет говорить что это неэффективно?
    Я буду говорить. Ибо прямой LDIR в коде быстрей на 27 тактов и
    не использует стек вообще.

    Именно таких фрагментов кода, которые вообще то уже есть в ПЗУ не надо будет вставлять в свою программу - они так же будут вызываться CALL <> но для этого надо будет сделать соответствующую настройку, а она делается только один раз!!!
    Любая настройка делается один раз. Вопрос не в том. Я утверждаю,
    что "библиотечные" функции имеют, примерно, среднее время исполнения в сотни, тысячи, а то и десятки тысяч тактов. И размер
    как минимум в несколько десятков байт. Экономия 10 тактов и
    трёх байт в таком случае представляется бессмысленной. Что-то вроде того, что "заставь дурака богу молиться". Бессмысленно вообще измерять такты на программе 90% времени ожидающей
    нажатие на кнопку или что-то в этом роде. Измерение чего-то
    вроде эффективности в тактах, байтах или других величинах --
    бессмысленно. Это эффективность чего? Экономии байтов? А время
    потраченное на создание кода? А стоимость других затраченных
    средств? А наличие механизмов отладки? (как тебе sts будет метки-то показывать в пропатченном коде?) Вопрос этот комплексный и смотреть с одного конца на него -- глупо.

    А сколько раз в программе такое запускается? Не один десяток, точно знаю! очистка экрана, переброс экрана, переброс других областей и т.д. и т.п. - это всё ЕСТЬ в ПЗУ, но этим мало кто пользуется потому
    Потому, что используя оптимизированную процедуру, использующую стек или LDI вместо LDIR, можно сэкономить куда больше, чем 10 тактов. На несколько порядков больше. Потому,
    что процедуры в ПЗУ жутко неоптимальны. Потому, что они реализуют недостаточную или излишнюю функциональность.

    что появляется зависимость от версии ПЗУ - в 82м ПЗУ одни точки, в 90м - другие,
    "Точки" там примерно те же самые. В качестве эксперимента поставь
    ПЗУ Basic 48 от Amstrad и убедись, что 2/3 программ перестанут работать.

    или иной Call или Jp) - и колбасим версию ПЗУ хоть как - хоть суём её часть с теневое ПЗУ хоть запаковываем его и при Reset раскаковываем в память - при "патче" программы она всё равно вызовет то что надо откуда надо а никак не приведёт к сбросу или какому нить ещё иррациональному поведению.
    А как программа вызовет что надо, если этого чего надо может просто не оказаться в новой версии ПЗУ?

    Вопрос отнюдь не в системе вызова, а в интерфейсе. Это уже совсем другой уровень абстракции.

  9. #78
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,255
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    82
    Поблагодарили
    35 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fk0
    У ней функциональности нет, а не проблем нет.
    есть все. и функциональность и проблемы.

    Цитата Сообщение от fk0
    Я, например, такой код никаким
    C-компилятором сгенерировать не могу, и я это знаю.
    хе. а то что компилятор генерит код под жестко зашитый адрес есть зер гут? или там тоже релоцируемая структура? тогда в чем проблема? это просто одна из реализаций, демонстрирующая применение идеи, формат достаточно сырой, но работающий.
    если бы его не было, все бы говорили "харэ трепаться, давай код работающий!". даешь код- идет кривление лицевого интерфейса %)))

    Цитата Сообщение от fk0
    А как быть с существующим кодом? Под него писать
    обёртку вокруг всё того же JP xxx.
    с существующим в смысле в исходниках или в бинарниках? в первом случае проблема решается контекстным поиском и заменой по тексту или написанием спецверсии компилятора (на крайняк). а второй случай- клиника... там даже таблица jp xx не поможет...

    Цитата Сообщение от fk0
    Откуда в команде CALL xxx возьмётся неверных номер функции?
    при компиляции... например юзаем старую версию системы, а программу компилируем с использованием новых заголовочных файлов. вариант с jp выдает красочный глюк на весь экран, а настройщик просто грязно матерится на несуществующие функции и нифига не запускает

    Цитата Сообщение от fk0
    Только, насколько я понимаю, Vitamin использует не номера, а имена функций.
    смешанная система. символьные имена применяются для компиляции и статической линковки. в итоговом модуле не должно быть символных имен вообще (хотя GriV ратует за них, грит это того стоит.... а мне памяти жалко для такого безобразия %)))

    Цитата Сообщение от fk0
    Я буду говорить. Ибо прямой LDIR в коде быстрей на 27 тактов и
    не использует стек вообще.
    енто просто не самый лучший пример имхо, так конечно никто делать не будет. имеются ввиду вообще процедуры из пзу. там довольно много фрагментов разных можно использовать.

    Цитата Сообщение от fk0
    Потому, что используя оптимизированную процедуру, использующую стек или LDI вместо LDIR, можно сэкономить куда больше, чем 10 тактов.
    имеются в виду накладные расходы на вызов процедуры. умноженные на количество фактических вызовов...

    Цитата Сообщение от fk0
    Вопрос этот комплексный и смотреть с одного конца на него -- глупо.
    Воистину!!! Знать три варианта расписали (GriV сие сделал вполне квалифицированно). Каждый может выбирать что ему выгодно. если точек входа не так много, то и таблица jp xxx сойдет, а если там развесистая клюква на 1000 с хреном вызовов, то можно и потратить сотню байт на настройщик, сэкономив килобайт на таблице

  10. #79
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    есть все. и функциональность и проблемы.
    Я уже писал: невозможно динамическое создание функции-фильтра, что убивает на корню идею трассировки
    вызовов. STS не показывает метки. Вообще ничего
    на ходу менять нельзя. Загрузить другую библиотеку (драйвер) --
    нельзя. Там если глубже копнуть, чего только не вылезет.
    Да, как замена CALL-у -- оно хорошо. Но речь не про CALL, речь
    про механизм вызова библиотечных функций. И о том,
    какими свойствами данный механизм (не) обладает.

    хе. а то что компилятор генерит код под жестко зашитый адрес есть зер гут? или там тоже релоцируемая структура?
    Есть компиляторы не умеющие генерировать позиционно-независимый (перемещаемый, настраиваемый при загрузке) код. Есть компиляторы не умеющие такой код генерировать.
    Есть ассемблеры не поддерживающие возможность создания информации необходимой для перенастройки кода на адрес. Наконец ест просто программы подразумевающие абсолютный адрес загрузки
    (99.9% на спектруме).

    тогда в чем проблема? это просто одна из реализаций, демонстрирующая применение идеи, формат достаточно сырой, но работающий.
    В том, что оно теоретически может работать никто не сомневается.
    Никто даже не говорит, что это плохо по каким-то причинам связанным с практической реализацей. Никто не говорит даже, что
    это плохая замена для CALL -- может и хорошая. Я говорю, это
    плохой интерфейс. Потому, что это всего-лишь настраиваемый
    CALL. С ним неудобно работать в динамике. Его неудобно отлаживать. Его, наконец, нельзя запускать непосредственно из ПЗУ -- просто потому, что настройки потребует весь код, а не малая
    интерфейсная часть, которая может быть размещена в ОЗУ, в малом его объёме (речь пока не идёт про практическое использование тех или иных решений).

    если бы его не было, все бы говорили "харэ трепаться, давай код работающий!". даешь код- идет кривление лицевого интерфейса %)))
    Увы, это так. Тут нужна большая и серьёзная "теоретическая" работа. Код писать дело нехитрое, обезьянья работа в сущности.
    Других дел в жизни хватает. И писать код в мусорную корзину
    тем более мало кому захочется.

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

    На счёт поиска и замены я не уверен. Я даже считаю, невозможно абсолютно любой код под твои макросы адаптировать. "Релокатор"
    наверняка не все выражения ассемблера поддерживает. В противном
    случае мы придём к компиляции перед выполнением.

    Я конечно же имел ввиду двоичный код. JP xxxx только и остаётся,
    если обернуть его в этот интерфейс.

    при компиляции... например юзаем старую версию системы, а программу компилируем с использованием новых заголовочных файлов. вариант с jp выдает красочный глюк на весь экран, а
    А мы возьмём и на шнуре от модема повесимся. И от этого умрём. Поэтому модемы -- абсолютное зло. Аргументация того же уровня.

    Для невнимательных: ИНТЕРФЕЙС НЕ МЕНЯЕТСЯ, ТОЛЬКО НАСЛЕДУЕТСЯ. Или, как вариант, имеется обязательный базовый
    интерфейс позволяющий на ходу получать информацию об используемом интерфейсе и, как вариант, переключать разные
    версии интерфейсов. В целом верно одно: всегда доступен
    базовый интерфейс. Через который можно выявить используемый
    интерфейс и возможную несовместимость. Это возможно на этапе
    "настройки" программы.

    настройщик просто грязно матерится на несуществующие функции и нифига не запускает
    Вариант с JP xxxx тоже, как ни странно, требует настройки.
    Ещё раз: массив JP xxxx таскается по раздельности В КАЖДОЙ
    ЗАГРУЖАЕМОЙ ПРОГРАММЕ. При загрузке обновляется из массива
    JP xxxx доступного в библиотеке. Почему так: потому, что адреса
    в конкретных командах CALL и JP адресуют именно свой "локальный"
    массив, потому что именно его адрес известн в момент компиляции,
    а адрес загрузки библиотеки -- неизвестен. В качестве оптимизации,
    при размещении библиотеки по фиксированному адресу в ПЗУ предлагается прямая адресация массива JP xxxx размещённого по
    известному адресу в ПЗУ. Но такой способ адресации является
    НЕЖЕЛАТЕЛЬНЫМ, потому, что ограничивает возможности использования интерфейса в части фильтрации, трассировки и т.п.
    И в таком случае, поскольку настройка становится "ненужной" дейстивтельно есть возможность напороться на проблему. Но против этого, как и при действительной настройке, достаточно лишь вызвав соответствующую функцию БАЗОВОГО ИНТЕРФЕЙСА, ГАРАНТИРОВАННО ИМЕЮЩУЮСЯ В ИНТЕРФЕЙСЕ, можно выяснить насколько имеющаяся библиотека совместима с требуемой.

    смешанная система. символьные имена применяются для компиляции и статической линковки. в итоговом модуле не должно быть символных имен вообще (хотя GriV ратует за них, грит это того стоит.... а мне памяти жалко для такого безобразия %)))
    Мне тоже было бы жалко. Потому как практического смысла не
    имеет. Лучше решить проблему идентификации интерфейсов. И кроме того, символьные имена уровня ассемблера -- как их сделать доступными на уровне кода? Опять же серьёзные ограничения технического плана. ALASM может и умеет, а GENS опять нет. Или ZASM скажем -- не умеет.

    енто просто не самый лучший пример имхо, так конечно никто делать не будет. имеются ввиду вообще процедуры из пзу. там довольно много фрагментов разных можно использовать.
    Речь про библиотеку функций с ЧЁТКО ОПРЕДЕЛЁННЫМ ИНТЕРФЕЙСОМ, или про несвязный набор фрагментов кода?

    имеются в виду накладные расходы на вызов процедуры. умноженные на количество фактических вызовов...
    Вот имеется функция ожидания нажатия на кнопку. Хрен ли толку, если ты на ней 10 тактов сэкономишь? Если для тебя действительно
    критична скорость: импортируй тескст (ассемблерный) функций и
    откажись от библитечных. Ибо 27 тактов на CALL и RET сверх того --
    тоже не мало. Экономить 10 тактов, чтоб тут же отдать 27 (на итерацию) -- вот этого я не понимаю. И не хочу понимать. Это бред.
    Кроме того, итеративные функции стоило бы переписать, чтоб цикл
    перенести в библиотеку. Условие окончания цикла можно определить функцией, указатель на которую передаётся аргументом при вызове библиотечной функции -- вот где экономия.

    Воистину!!! Знать три варианта расписали (GriV сие сделал вполне квалифицированно). Каждый может выбирать что ему выгодно. если точек входа не так много, то и таблица jp xxx сойдет, а если там развесистая клюква на 1000 с хреном вызовов, то можно и потратить сотню байт на настройщик, сэкономив килобайт на таблице
    Если там клюква на 1000 вызовов, по 50 байт на вызов -- займёт
    всю память и ничего не останется... Для клюквы нужны свои, специфические решения.

    Речь про что-то более общее. Где вызов занимает сотни-тысячи, реже десятки тысяч тактов и десятки, реже сотни байт. Где общее число вызовов на модуль -- порядка единиц-десятков. Пример?
    "Драйвер" модема, CMOS, HDD, CDROM... Модуль арифметики с
    плавающей запятой (откуда там сотни вызовов? Столько функций
    не наберётся). Библиотека строковых функций. Библиотека
    поточного (побайтового) ввода-вывода для TR-DOS. Упаковщих
    HRUST. Текстовая консоль, драйвер "мыши" со стрелочкой, примитивный (максимум уровня ZXASM) "GUI" интерфейс. Может быть в последнем случае можно превысить предел в 100 вызовов. В таком случае, интерфейс можно разбить на 2-3 части (предел -- 85 виртуальных функций на объект).

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

    Wink

    2fk0> я со многими твоими доводами согласен, а ты же с моими (и витаминовскими) доводами принципиально соглашаться не хочешь, даже не хочешь рассматривать варианты вызовов другого типа (?). Я ж написал уже в сравнительной таблице какие достоинства и недостатки того или иного метода - так что каждый в праве выбирать что он хочет. Я СЧИТАЮ (т.е. это IMHO) что все другие методы имеют право на жизнь, но именно постольку поскольку должна быть альтернатива - я же их предпочитаю не использовать (свой выбор я уже описал), а потому считаю что почти раскрыл тему треда (упустив может быть какой нибудь совсем раритетный способ вызова). А посему просто не буду продолжать творить флейм ))))

    P.S. Оффтоп на 100%, но по жизни очень правильный совет. Наш препод по философии всегда нас учил поступать следующим образом: "Прежде чем критиковать точку зрения прочувствуй на своей шкуре все её достоинства и недостатки, ты не любишь так делать потому твоё мировоззрение очень ограниченно." В этом смысле я разделил твою (fk0) точку зрения, я САМ пробовал писать таким образом и выстрадал все плюсы и минусы системы, потому считаю что имею достаточно объективную точку зрения.
    Последний раз редактировалось GriV; 05.12.2005 в 18:44.
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

Страница 8 из 10 ПерваяПервая ... 45678910 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Подключение клона "Байт" к ТВ через RGB.
    от Surfin_Bird в разделе Изображение
    Ответов: 6
    Последнее: 11.03.2013, 16:59
  2. Ответов: 6
    Последнее: 09.12.2007, 22:02
  3. Ответов: 8
    Последнее: 01.05.2006, 01:38
  4. Принтер через 580ВВ55
    от Sonic в разделе Несортированное железо
    Ответов: 14
    Последнее: 08.06.2005, 09:26

Ваши права

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