Главная Дока Микро-80 Радио-86РК ЮТ-88 Орион-128 Ссылки Новости Письмо

Описание компьютера Радио-86РК
Журнал РАДИО

ПИШЕМ ПЕРЕМЕЩАЕМЫЕ ПРОГРАММЫ

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

Для достижения перемещаемости используют различные приемы: размещают в определенной области памяти стандартную таблицу переходов , формируют специальную таблицу коррекции BITMAP , применяют особые процедуры модификации адресов в командах перехода. Можно, однако заранее позаботиться о перемещаемости разрабатываемой программы и получить в результате код мало зависящий или, в идеальном случае, совсем не зависящий от места расположения в памяти компьютера. Некоторые приемы, позволяющие достичь этого, описаны ниже.

Предполагается, что читатель знаком с основными принципами работы микропроцессора КР580ВМ80 и имеет перед собой таблицу с системой его команд.

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

Описываемый фрагмент состоит из собственно подпрограммы определения количества байт в машинной команде, назовем ее NB, и обращения к ней. Обращение находится в адресах 120Н126Н, а далее, начиная с адреса 127Н (хотя адрес и не имеет значения) , расположена подпрограмма NB, с которой и начнем анализ.

Характерной чертой подпрограммы является полное отсутствие условных переходов, замененных из соображений перемещаемости возвратом по условию. Проверка в этом случае происходит в следующей последовательности: задаются выходные значения регистров В и С, соответствующие той или иной группе команд; выделяются характерные для этой группы биты; операциями ANI или СРI устанавливаются признаки и при выполнении необходимого условия происходит выход из подпрограммы. В противном случае анализ кода продолжается аналогичным образом.

Рассмотрим несколько примеров. Команда 127 заносит в ВС константу, соответствующую однобайтовой операции, и если в ОЗУ по адресу, записанному в регистре HL, находится NOP (код 0), то происходит выход из подпрограммы (адреса 12СН и 12DH). Затем выделяется вся средняя часть таблицы команд микропроцессора КР580ВМ80 (коды в диапазоне 40H—BFH), содержащая однобайтовые команды. Это сделать труднее, так как проверить сразу два условия по принятой методике нельзя. Внимательное изучение кодов команд показывает, однако, что можно обойтись и одной проверкой: при попадании в указанный диапазон два старших бита кода различны, а в противном случае они одинаковы (читатели могут убедиться в этом самостоятельно). Для сравнения старших битов производятся два циклических сдвига влево через бит переноса CY. При этом седьмой (старший) бит оказывается в нулевом бите аккумулятора, а шестой попадает в CY. По команде ADC С (адрес 130Н) интересующие нас биты складываются, и если они были различны, дают единицу (не забывайте, что в регистре С записан 0, и он не влияет на результат сложения). Если же при сложении в младшем бите получился 0, то анализ необходимо продолжить. Команды 134—139 “распознают” операции LDAX и STAX, в коде которых характерными битами являются три младших (с 0 по 2) и три старших (с 5 по 7). Трем младшим соответствует комбинация 010, а трем старшим — 000. Нетрудно убедиться, что после сброса битов 3 и 4 (команда 135) результат А-2 гарантирует, что мы имеем дело именно с этой группой команд.

Дальнейший анализ происходит аналогично. Следует только иметь в виду, что перед переходом к выявлению команды с другим количеством байт необходимо каждый раз предварительно изменять выходные параметры в регистрах В и С. Если коду не соответствует команда микропроцессора КР580ВМ80, то в регистровую пару ВС подпрограмма выдает 0.

Таким образом, мы убедились, что достаточно сложная в логическом отношении программа не содержит ни одного явно заданного адреса, а значит, полностью перемещаема. Как же к ней обратиться, если команда CALL требует задать абсолютный адрес подпрограммы? Один из возможных вариантов обращения использован в нашем примере (адреса 120Н—126Н). По пред полагаемому адресу рабочей области памяти (в таблице он заменен символами ZZZZ, ему соответствует метка Х XXX) должен быть предварительно занесен небольшой фрагмент приведенный в примечании таблице. При обращении к нему происходит вычисление абсолютного адреса начала подпрограммы по смещению заданному в регистровой паре DE ( в нашем случае адрес определяется как 126+1=127).

Коды рассмотренной программы можно перемещать по памяти без единого изменения, при этом работоспособность программы полностью сохраняется. Требуется, правда, выделить 7 байтов в рабочей области, адреса которых заданы “жестко”, но, представляется, это незначительная плата за полную перемещаемость программы (особенно удобно, если указанные 7 команд размещены в ПЗУ).

Автор желает успеха начинающим программистам и надеется, что описанные приемы разработки перемещаемых программ будут полезны владельцам “Радио-86РК”, “Микроши” и других микрокомпьютеров на процессоре КР580ВМ80.

Е. ЕРЕМИН

г. Пермь.

Отсканировано с журнала Радио № 12 1991 г.
Отредактировано Лесных Ю.

Описание компьютера Радио-86РК
Журнал РАДИО



(C) 2003-2010 www.danbigras.ru Наш адрес: info@danbigras.ru
Всё о старых компьютерах