Важная информация
Показано с 1 по 5 из 5

Тема: Проблемы трансляции.

  1. #1 Проблемы трансляции. 
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    При написании трансляторов СТЕПЛЕР > ASM мы обязательно столкнемся, и уже столкнулись с разного рода проблемами. Например, отсутствие идей по реализации некоторых расширенных команд. В этой теме я предлагаю делиться советами и проблемами, возникшими при создании трансляторов.
    Какая ситуация на данный момент возникла у меня: Недавно взялся за реализацию расширенных команд. Первой решил делать именно команду 9, для вызова прерываний. Устроить ее было немного сложнее, чем под интерпретатором (хотя в LInt я тоже использовал "самопальную" процедуру CallInt для вызова прерываний). Особенного баттхерта я словил, когда понял, что частичные регистры (все младшие и старшие байты РОН - ah,al,bh,bl и.т.п) должны располагаться в разных переменных, а не в одной. Поясню: ~(9)(<IntNum>,<VarStart>). AH будет жить в VarStart$, AL в (VarStart+1)$, BH в (VarStart+2)$ и.т.п. Возник вопрос, почему бы не читать\писать все РОН в одну переменную? Например, AX в VarStart$, BX в (VarStart+1)$. Все переменные имеют размер слова, и прекрасно для этого подходят. Мне это кажется гораздо более удобным вариантом: Во первых, для загрузки всего регистра потребуется лишь одна команда присвоения, а не две, а во вторых по прежнему есть возможность без труда выделить значение как младшей, так и старшей части регистра, при необходимости. Профит также в том, что существенно облегчится и ускорится откомпилированный вариант процедуры для вызова прерывания. Программ, использующих вызов прерываний не так много (вроде этим кроме моей Mouse.st никто больше и не занимался), и при необходимости их можно будет без особого труда подправить на новые правила вызова.
    В любом случае, команда вызова прерываний под текущий синтаксис мной реализована, и работает корректно, не считая того момента, что нельзя при вызове пользоваться первыми двумя переменными, но и это постараюсь поправить.
    Также, уже готовы подпрограммы 10-13 для работы с файлами, разве что некорректно работает программа шифрования файлов (она просто копирует все из файла источника в приемник - буду разбираться, чего так)

    Без проблем будут реализованы также процедуры чтения\записи в порты, пауза и звук. Вот с графикой посложнее будет. Тут варианта по сути два. Или ковырять коды графического модуля, пытаясь добыть исходники и реализовать их в трансляторе, или же писать собственные процедуры для работы с SVGA. Я попробую надыбать коды из используемой нами на данный момент библиотеки, однако исходников сей библиотеки в интернете я не нашел, а навык работы с дизассемблереами у меня не очень хорошо развит =). Тем не менее, о прогрессе буду сообщать, также буду рад любым советам и предложениям.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,535
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Исходники svga256 сейчас у автора попрошу. Что-то он на маил не отвечает, попробую позвонить.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    Абадябер (19.11.2011)

  4. #3  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Если появится какой либо прогресс, связанный с получением исходников, то тут же дайте мне знать
    Закончена работа над трансляцией специальных функций 6,7,8,9,10,11,12,13,15. Сейчас тестирую все это дело. Функции для работы с файлами работают прекрасно, а ошибка работы программы шифрования файлов была связана с некорректной оптимизацией листинга самим транслятором. Исправлено. Еще немного поковыряюсь, и смогу выложить новую промежуточную новую версию транслятора. Также, теперь переменные хранятся в отдельном сегменте, что позволяет обращаться сразу ко всем 65536/2-2 переменным. Еще - генерируемый код оптимизируется намного лучше.
    Осталось наладить трансляцию остальных специальных функций. Они все связаны с графикой, поэтому нужно или ждать исходников, или браться за реализацию всего этого дела самостоятельно. А это растянется на долго.
    Можно было бы использовать для трансляции другую библиотеку для работы с SVGA, например, с открытыми исходниками, но проблема в том, что не факт, что в ней будут реализованы все функции, описанные в языке. Например, может не быть сервисов масштабирования шрифта при выводе текста в граф-режимах, или чего либо еще, поэтому стоит работать осторожно.

    1. Также, есть некоторое неудобство, при трансляции любой программы, которая пользуется специальными функциями:
    Формат записи вызова специальной команды такой: ~(<выражение>)(<выражение>). Это значит, что если программа вызывает хотя бы одну специальную функцию, в листинг придется записывать коды для всех специальных функций. Потому что любая подобная конструкция не даст информации о том, что именно может быть использовано: ~(2$)(<выражение>). На данный момент код для девяти реализованных функций занимает около 1500-2000 байт в компилированном виде. Когда добавиться работа с графикой, программы, использующие СФ будут весить минимум 5-6 кб (если не больше), что уже не очень солидно =)
    Есть пару вариантов решения такой проблемы:
    * Можно вручную удалять из сгенерированного листинга коды подпрограмм СФ, которые гарантированно не будут использоваться в программе.
    * Можно запретить вызов специальной функции по выражению, но это слабо вписывается в идеологию языка.
    * Можно замутить "интеллектуальный" сканер. Почти никто не вызывает (во всяком случае, до этого не видел) специальные функции по выражению. Сканер может анализировать присутствующие в программе вызовы СФ, и включать в листинг только код необходимых специальных функций. Или весь набор, если где либо происходит вызов СФ по выражению, которое нельзя рассчитать на этапе компиляции. В таком случае, попахивает необходимостью писать небольшой оптимизатор компилируемого кода =)

    2. Настал тот момент, когда появляется смысл задумываться над компиляцией языка. На данный момент в самом языке есть не большая проблема: Всем своим синтаксисом он явно не рассчитан на компиляцию. Например, нет полноценных библиотек (USES - лишь директива включения, в конечном итоге, все равно получается лишь один файл), код никак не делится на сегменты. Сегменты нужны к тому, чтобы не было ограничений на размер генерируемого ассемблером после трансляции кода. COM - файл не может перемахнуть за размер в 64Кбайт, а если генерировать ассемблерный листинг, оформляя его для компиляции в EXE, становится не понятно, как разбивать код на сегменты, т.к язык не дает для этого необходимой информации. Полноценные библиотеки, или модули, помогут тем, что весь присутствующий в них код будет грузиться в отдельный сегмент. Вызывать процедуры из него можно будет используя дальнюю модель вызова.
    Пока это лишь мысль. Сначала все равно придется закончить работы над трансляцией, прежде чем браться за что нибудь подобное
    Дружба-магия-радость!
    Ответить с цитированием  
     

  5. #4  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,535
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    С исходниками такой процес: Он мне ответил, сказал, что исходников у него нет, но возможно они есть на некоторых других старых компьютеров. Я тоже знаю одно место, где они были, возможно, есть там и сейчас. Надо будет сьездить туда и посмотреть,Может до сих пор лежат.
    Заодно и возьму свои амые первые программы
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  6. Пользователь сказал cпасибо:

    Абадябер (23.11.2011)

  7. #5  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,535
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Насчёт вызова пециальных команд можно поступить так: Компилятор проходит по числу и если не находит там команд, модифицирующих число ($,g,?), то вычисляет это число и втавляет в код только эту команду. Если же находит одну из них, то вставляет все функции.

    Насчёт команды вызова прерывания: Тут такая проблема: Числа в степлере - 16-битные знаковые, а регистры ax,bx,cx,dx - беззнаковые, это значит что чтобы перевести одно в другое, надо будет неслабо пошевелить мозгами.
    Например, число A063h это эээ... -24496
    Конечно, введя шестнадцатеричную ситему счиления, будет немного легче это сделать, но всё равно.
    Думаю, лучше оставить как есть.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

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

Похожие темы

  1. FBSound проблемы c типами данных
    от >Quiet Snow< в разделе FreeBasic
    Ответов: 8
    Последнее сообщение: 13.01.2013, 15:52
  2. Проблемы с интерпретатором Brainfuck
    от Kakos_nonos в разделе Turbo Pascal
    Ответов: 2
    Последнее сообщение: 16.04.2011, 17:00
  3. Проблемы с компиляцией
    от Kakos_nonos в разделе C/C++
    Ответов: 0
    Последнее сообщение: 21.02.2011, 20:09
  4. Опять проблемы
    от Dispetcher14 в разделе Портативные компьютеры
    Ответов: 4
    Последнее сообщение: 13.02.2011, 17:54
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •