Радио-86РК/Радио 05-93/Ассемблер: Новые возможности
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: С. СМИРНОВ |
Популярный пакет прикладных программ «МИКРОН» для радиолюбительского компьютера «Радио-86РК» появился на свет почти шесть лет назад [1]. За это время читатели получили усовершенствованные текстовые редакторы [2, 3], улучшен и редактор, встроенный в «МИКРОН», и только транслятор с языка АССЕМБЛЕР остался вне зоны внимания. Чем это объясняется? Прежде всего тем, что транслятор все же неплох. Если объем разрабатываемой программы относительно невелик — до 2 Кбайт (в дальнейшем под объемом или размером программы будет подразумеваться размер файла машинных кодов, полученных при трансляции ее текста), то обычно каких-либо проблем при трансляции не возникает. А огромная армия радиолюбителей-владельцев «Радио-86РК» на первых порах, естественно, писала короткие программы. Свою роль сыграло и то, что транслятор АССЕМБЛЕРа — одна из самых сложных программ (как по алгоритму работы, так и по его реализации) из числа опубликованных в журнале. По мере возрастания объема и сложности создаваемых программ недостатки транслятора «МИКРОН» начинают проявляться все сильнее. Оперативная память компьютера используется полностью уже при объемах 2—4 килобайта, причем переполнение чревато весьма неприятными сюрпризами и нередко приводит к потере информации. Наиболее внимательные читатели заметили и некоторые странности в работе АССЕМБЛЕРа: то вдруг «проходят» строчки с явными синтаксическими ошибками, то наоборот, строка с заведомо правильным синтаксисом помечается как содержащая ошибку.
Таким образом, направления совершенствования транслятора с языка АССЕМБЛЕРа становятся очевидными:
- во-первых, устранение ошибок при синтаксическом анализе исходного текста и,
- во-вторых, обеспечение трансляции программ максимально возможного объема, как за счет более эффективного использования ОЗУ компьютера, так и за счет специальных мер.
Рассмотрим подробнее ограничения транслятора «МИКРОН» и пути их преодоления.
ИСПОЛЬЗОВАНИЕ ОПЕРАТИВНОЙ ПАМЯТИ КОМПЬЮТЕРА
Основное ограничение на размер исходного текста ассемблерной программы накладывает небольшой объем ОЗУ (32 КБайта для базового варианта). Каждый, кто писал программы объемом свыше 3 Кбайт, с этим сталкивался. Что можно сделать для облегчения процесса создания программ с большим объемом исходного текста и с большим количеством комментариев (для программ на языке АССЕМБЛЕРа это немаловажно!)? Где скрываются резервы памяти?
Во-первых, в пакете программ «МИКРОН» использован принцип одновременного хранения в оперативной памяти как текстового редактора, так и транслятора. Это свойственно «большим» микро-ЭВМ, таким, например, как IBM PC. Удобство такой организации работы (возможность оперативного редактирования и трансляции) не вполне и не всегда компенсирует сокращение доступного ОЗУ, тем более что во избежание утраты исходного текста его все равно перед пробным запуском оттранслированной программы приходится записывать на магнитофон. Удаление текстового редактора перед трансляцией позволит «сэкономить» 2 КБайта памяти.
Во-вторых, в исходном тексте программы всегда присутствуют символы, не обрабатываемые транслятором: комментарии и последовательности пробелов там, где достаточно одного (например, перед мнемоникой команд). Их общий объем в зависимости от стиля программирования при максимальном использовании памяти может составлять несколько килобайт. Естественным желанием будет удалить эти символы перед трансляцией текста, что, кроме всего прочего, еще и сократит время трансляции.
В-третьих, при создании больших программ перечисленных резервов может и не хватить. Текст программы в этом случае придется разбить на две или несколько частей и транслировать по отдельности, объединяя затем полученные машинные коды в единую программу. Главная проблема при этом — связывание программ (использование в первой части символических имен из второй и наоборот). Простейшее решение, определение необходимых имен с помощью псевдооператора EQU , как водится, оказывается и самым худшим: после каждой корректировки какой-либо части текста и последующей трансляции приходится корректировать значения имен во всех других частях. Если таких имен 1—2, изменить их значение вручную не составляет труда, а если имен несколько десятков в каждой части? Тогда процесс нужно автоматизировать, В технике ЭВМ проблема связывания решается с помощью специальных программ — редакторов связей [4]. Но редактор связей, в свою очередь, требует определенного объема оперативной памяти и в «Радио-86РК» его применить трудно. Наиболее целесообразным представляется «поручить» решение задачи связывания самому АССЕМБЛЕРу. На это можно пойти, если подпрограмма связывания АССЕМБЛЕРа будет невелика.
В-четвертых, таблица меток АССЕМБЛЕРа «МИКРОН» располагается в ОЗУ сразу после текста программы. При трансляции сложных программ с большим количеством меток размер свободной части ОЗУ может оказаться недостаточным для их размещения, будут испорчены стек и рабочая область МОНИТОРа с непредсказуемыми последствиями.
В-пятых, из-за несовершенства контроля размера оттранслированных кодов они могут быть расположены на месте начала исходного текста и испортить его.
Итак, ограниченные ресурсы ОЗУ компьютера «Радио-86РК» вынуждают сформулировать требования по экономии памяти, которые нужно учесть при модернизации или разработке нового АССЕМБЛЕРа:
- не размещать в ОЗУ и редактор и транслятор одновременно;
- иметь возможность удаления из текста программы перед трансляцией всех комментариев и лишних пробелов;
- обеспечить возможность связывания фрагментов программ;
- исключить переполнение ОЗУ;
- контролировать размер оттранслированного кода.
СИНТАКСИЧЕСКИЙ АНАЛИЗ ПРОГРАММЫ
Во время трансляции исходного текста любой транслятор анализирует его синтаксис и выявляет допущенные ошибки. Применительно к АССЕМБЛЕРУ «МИКРОН» можно указать на три основных недостатка в синтаксическом анализе, которые желательно устранить:
- Не все синтаксические ошибки обнаруживаются. Если набрать и оттранслировать, например, заведомо неверные строки (см. табл. 1), то ни одна из допущенных ошибок не будет обнаружена.
- Некоторые строки с правильным синтаксисом помечаются как ошибочные (см. табл. 2).
- Нельзя признать удобным принятый в АССЕМБЛЕРе «МИКРОН» метод поиска ошибочной строки. Ведь для этого приходится повторно транслировать текст программы в режиме «1» и ждать появления строки с ошибкой, не ослабляя внимания ни на секунду, так как появление ошибочной строки ничем другим, кроме как меткой «*», не отличается. Если ошибок несколько, то их поиск затягивается.
Таблица 1 One: EQU -1 TWO: EQU -2 ; TEST1: EQU 234H TEST2: EQU 235H TEST3: EQU 236H ERR1: EQU TEST1-TEST2 ERR2: EQU TEST1-TEST3 MOV M,M HLT несуществующая команда SPHW SPHL ошибка в мнемонике XCHR XCHG ошибка в мнемонике STX D STAX D ошибка в мнемонике STRX D STAX D ошибка в мнемонике JM@ START JM START ошибка в мнемонике J@@ START JMP START ошибка в мнемонике j@@@ START JMP START ошибка в мнемонике START: EQU 1100Н
Несомненно, что значительного расширения возможностей АССЕМБЛЕРа невозможно достичь без существенного увеличения его объема. Вот почему, кроме устранения отмеченных выше недостатков АССЕМБЛЕРа, «МИКРОН» представляется оправданным только введением в него операций арифметического деления и умножения, а также арифметических операций с символьно заданными псевдооператором DB байтами (например, DB 'А'+80Н).
Автор попытался учесть сформулированные требования и совместить это с минимально возможным увеличением объема транслятора. В результате на основе АССЕМБЛЕРа «МИКРОН» разработан транслятор с языка АССЕМБЛЕРа «М&S». Машинные коды АССЕМБЛЕРа «М&S» с ускоряющей подпрограммой приведены в табл. 3, поблочные контрольные суммы — в табл. 4.
Таблица 4 0000 - 00FF 364E 0100 - 01FF 9160 0200 - 02FF С564 0300 - 03FF 5511 0400 - 04FF 04СЕ 0500 - 05FF 019D 0600 - 06FF D537 0700 - 07FF DC95 0800 - 08FF C7D7 0900 - 09FF E0D0 0A00 - 0AFF А001 0А00 - 0ADF B700 0000 - 0ADF A001
АССЕМБЛЕР «М&S» занимает в ОЗУ 2,5 КБайта (0000H-09FFH) и предназначен для работы в компьютере «Радио-86РК» с объемом памяти 32 КБайта. АССЕМБЛЕР может быть размещен в ПЗУ. Все возможности АССЕМБЛЕРа «МИКРОН» сохранены и добавлены новые:
- после запуска АССЕМБЛЕРа командой МОНИТОРа G и ввода режима трансляции 1—4 (новый режим «4» рассмотрим позднее) на экран выводится запрос « COMPRESS ?», при положительном ответе на который (нажатие клавиши Y) из исходного текста программы перед трансляцией удаляются все комментарии и лишние пробелы;
- затем следует запрос на использование таблицы меток, созданной при предыдущей трансляции и хранящейся в ОЗУ, « TABLE ?», чем в значительной мере решается проблема связывания. Если была нажата клавиша Y, то в случае отсутствия в памяти таблицы меток на это укажет сообщение «TABLE NOT FOUND», а затем последует рестарт АССЕМБЛЕРа (возврат к началу работы);
- в процессе трансляции выдаются сообщения о номере выполняемого прохода — «PASS1», «PASS2»;
- при обнаружении ошибки в режиме трансляции «1» подается звуковой сигнал, вывод протокола трансляции приостанавливается и продолжается только после нажатия любой клавиши, кроме F4, нажатие F4 трансляцию прерывает; реакция на ошибку во всех остальных режимах отличается только тем, что трансляция не прерывается, а строка с ошибкой выводится на экран;
- нажатие любой клавиши в режиме трансляции «1» ее приостанавливает или прерывает, если нажата клавиша F4;
- допускаются операции арифметического Умножения (*, знаковое) и деление (/, беззнаковое);
- все арифметические операции выполняются последовательно, слева направо, БЕЗ ПРИОРИТЕТА;
- допускается использование арифметических операций с байтом, заданным в символьном виде псевдооператором DB, при этом байт должен быть одиночным (допускается: DB 'TES', ' T'+80H и не допускается: DB 'TEST'+80H);
- символ комментария «;» не обязательно должен быть первым в строке, если вся строчка—комментарий, достаточно, чтобы он был первым значащим символом;
- в режиме трансляции «4» созданная АССЕМБЛЕРОМ таблица меток по завершении трансляции будет переписана в самую верхнюю часть доступной области ОЗУ, использование этой таблицы лежит в основе примененного метода связывания программ;
- после трансляции в режиме «4», кроме информации об ошибках и границах полученного программного модуля, дополнительно выводится адрес размещения переписанной таблицы меток «TABLE BEGIN XXXX», которая размещается в ОЗУ, как показано на рис. 1. При нехватке места для размещения переписанной таблицы меток последует предупреждение «TABLE BEGIN SMALL RAM», в остальном режим «4» совпадает с режимом «3» АССЕМБЛЕРа «МИКРОН»;
- обнаруживаются некоторые синтаксические ошибки, которые «не замечал» АССЕМБЛЕР «МИКРОН», для выявления всех или большинства ошибок необходимо значительно изменить алгоритм работы АССЕМБЛЕРа и занять гораздо больше памяти, по этой же причине не устранено ложное определение ошибочной строки при присваивании метке значений −1, и −2.
Во всем остальном АССЕМБЛЕР «М&S» полностью совпадает с АССЕМБЛЕРОМ «МИКРОН» и при необходимости можно подробно ознакомиться с процессом составления программ на АССЕМБЛЕРе и их трансляцией в опубликованных ранее статьях.
Остановимся поподробнее на организации связывания программ. На первый взгляд, методика, предлагаемая автором, довольно сложна, но после приобретения некоторых навыков работы, затруднений обычно не возникает. Те, кто писал программы, исходный текст которых не помещался в ОЗУ компьютера «Радио-86РК», по достоинству оценят эту особенность нового АССЕМБЛЕРа. Процедуру связывания поясним на примере. Предположим, что текст большой программы, который невозможно оттранслировать целиком, пришлось разбить на два фрагмента для трансляции по отдельности. Эти фрагменты назовем условно «А» и «Б». В каждом из текстов «А» и «Б» используются символические имена, определенные в другом. Для получения оттранслированной программы выполняется следующая последовательность действий:
- загрузить АССЕМБЛЕР «М&S» и текст «А»;
- оттранслировать текст «А» с использованием режима «4», не отвечая Y на запрос «TABLE ?» и не обращая внимания на ошибки * 2 (неопределенная метка);
- выйти в МОНИТОР и директивой I загрузить фрагмент исходного текста программы «Б» (текст должен быть записан в формате МОНИТОРа, например редактором WEL [3]), проверить, что адрес конца текста не превышает ХХХХ (то есть, не испорчена таблица меток, составленная при трансляции фрагмента «А»);
- оттранслировать текст «Б», ответив Y на запрос « TABLE ?»;
- выйти в МОНИТОР и записать на магнитофон вторую часть оттранслированной программы;
- запустить АССЕМБЛЕР и повторно оттранслировать текст «Б» в режиме «4», не отвечая Y на запрос АССЕМБЛЕРа «TABLE ?» и не обращая внимания на ошибки * 2;
- выйти в МОНИТОР и загрузить текст «А»;
- оттранслировать текст «А», ответив Y на запрос «TABLE ?»;
- выйти в МОНИТОР и записать на магнитофон первую часть оттранслированной программы;
- считать с магнитофона последовательно первую и вторую части программы с последующей их пересыпкой директивой Т МОНИТОРа в область работы, в результате в ОЗУ окажется полностью оттранслированная программа;
- записать полученную программу на магнитофон.
При трансляции текстовых фрагментов «А» и «Б» необходимо следить, чтобы адрес начала очередного загруженного текста совпадал с адресом текстового буфера АССЕМБЛЕРа, который находится в ячейках с адресами 0005Н (младший байт) и 0006Н (старший байт).
Если исходный текст программы приходится разбивать на три и более частей, действия оператора усложняются, однако алгоритм действий сохраняется: при разбиении на N частей поочередно транслируют все части, начиная с 1 и до N −1 в режиме «4», производя накопление меток (каждый раз отвечая Y на запрос «TABLE ?»). Разумеется, при этом необходимо следить за использованием оперативной памяти, предотвращая переполнение. Накопив набор меток, приступают к рабочей трансляции N -й части, подтвердив использование таблицы меток. Оттранслированную N-ю часть программы записывают на магнитофон. Затем процедуру накопления меток и трансляции с ее использованием применяют для каждой из оставшихся частей текста программы, помня, что в таблице в каждый момент времени должны быть накоплены метки от всех частей программы, кроме рабочей. Окончательное «сшивание» программы из наборов кодов проще всего произвести, загрузив в компьютер с магнитной ленты готовые фрагменты и переписав на магнитофон полную программу. Трансляцию «по частям» рекомендуется начать с разделенной на несколько частей небольшой простой программы, наращивая сложность постепенно.
РАСПРЕДЕЛЕНИЕ ПАМЯТИ ПРИ РАБОТЕ АССЕМБЛЕРа
Рабочая область и стек АССЕМБЛЕРа находятся в рабочей области МОНИТОРа компьютера, что вызвано необходимостью освободить как можно больше памяти для исходного текста программы. Корректное использование рабочей области МОНИТОРа не нарушает работу его подпрограмм, использующихся АССЕМБЛЕРОМ. Таким образом, область 0A00H-75FFH полностью выделяется под область трансляции и текст транслируемой программы. Выделение необходимого под область трансляции объема ОЗУ производится соответствующим изменением адресов начала области трансляции и начала текстового буфера АССЕМБЛЕРа.
Адрес начала области трансляции хранится в ячейках 000ЗН и 0004Н, а адрес текстового буфера — в ячейках 0005Н и 0006Н (младший и старший байты соответственно). Команды вызова подпрограмм МОНИТОРа расположены в ячейках 0763Н-0774Н, все обращения к МОНИТОРу корректны.
При начальной загрузке АССЕМБЛЕРа с магнитофона в области 0A00H-0ADFH находится усовершенствованная подпрограмма поиска меток, существенно ускоряющая процесс ассемблирования. Она автономна и АССЕМБЛЕР может работать без нее в тех случаях, когда приходится экономить каждый байт. Для работы с ускоряющей подпрограммой начало области трансляции устанавливают не ниже 0АЕ0Н (без нее — 0А00Н) и первый запуск АССЕМБЛЕРа производят с адреса 0А00Н. Последующие запуски АССЕМБЛЕРа (если, конечно, он не перезагружался с магнитофона) производят, как обычно, с адреса 0000Н.
Интересующимся проектированием и реализацией трансляторов с языка АССЕМБЛЕР можно рекомендовать дополнительную литературу [4].
С. СМИРНОВ, г. Гусь-Хрустальный — Зеленоград
ЛИТЕРАТУРА
- Барчуков В. и др. Редактор и АССЕМБЛЕР для «Радио-86РК». — Радио, 1987, № 7, с. 22-26.
- Барчуков В. и др. Дизассемблер для «Радио-86РК». — Радио, 1988, № 3, с. 27-31.
- Смирнов С. Редактор текстов «WEL». — Радио, 1992, № 8, с. 19-24 и Радио, 1992, № 9, с. 24-26.
- Бек Л. Введение в системное программирование. — М.: Мир, 1988.