Радио-86РК/Радио 03-88/Дизассемблер

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: В. БАРЧУКОВ, Е. ФАДЕЕВ

Источник: http://retro.h1.ru/RK86/Edit/DizAsm.php

Опубликованный пакет программ «Микрон» позволяет создавать прикладные программы на языке АССЕМБЛЕРА, однако нередко перед радиолюбителем возникает и обратная задача — по имеющимся кодам какой-либо программы воссоздать (дизассемблировать) ее текст на языке АССЕМБЛЕРА. Дизассемблирование может потребоваться, например, в случае утери первоначального исходного текста программы, для анализа и дополнения новыми возможностями программ, написанных другими программистами, для переноса рабочей области программы в другую область ОЗУ…

Между символическими командами языка АССЕМБЛЕРА и кодами машинах команд существует взаимно однозначное соответствие, поэтому, имея таблицу кодов команд микропроцессора, любую программу можно дизассемблировать вручную. Многие радиолюбители, чтобы понять, как работают программы, опубликованные в журнале, видимо, этим уже занимались и на собственном опыте убедились, сколь продолжителен и кропотлив этот труд.

Имея в руках такого помощника, как персональный компьютер, эту работу можно возложить на него, загрузив предварительно в его память программу ДИЗАССЕМБЛЕР. Она позволит с минимальными затратами времени создать текст любой программы на языке АССЕМБЛЕРА, который, естественно, в дальнейшем может быть оттранслирован с помощью АССЕМБЛЕРА ASSM. *МИКРОН*.

В табл.1 приведены машинные коды нового пакета программ «МИКРОН» который состоит из улучшенной версии РЕДАКТОРА ED."МИКРОН" и ДИЗАССЕМБЛЕРА DIS. «МИКРОН». Каждая из этих программ занимает 2 Кбайт памяти и может работать независимо друг от друга. Новую версию РЕДАКТОРА можно объединить с АССЕМБЛЕРОМ ASSM."МИКРОН", заменив коды старого редактора на новые. Сделать это лучше следующим образом: пользуясь директивой М МОНИТОРА, введите в ОЗУ компьютера коды из табл.1 блоками по 256 Байт с последующей записью их на магнитную ленту и сверкой контрольной суммы записанного блока с контрольной суммой соответствующего блока из табл.2.

Таблица 2.

ОБЛАСТЬ ОЗУ КОНТР. СУММА ОБЛАСТЬ ОЗУ КОНТР. СУММА
0000 — 00FF

0100 — 01FF
0200 — 02FF
0300 — 03FF
0400 — 04FF
0500 — 05FF
0600 — 06FF
0700 — 07FF

1D46

6F40
5E2F
CE8F
8D43
8826
98AD
32EB

0800 — 08FF

0900 — 09FF
0A00 — 0AFF
0B00 — 0bff
0C00 — 0CFF
0D00 — 0DFF
0E00 — 0EFF
0F00 — 0FFF

2BC4

CB8B
9430
C777
733Е
3F30
A617
E762

0000 — 0FFF 5422    

Затем загружают последовательно все блоки с магнитной ленты в ОЗУ компьютера. В результате в ОЗУ окажется полный пакет с РЕДАКТОРОМ и ДИЗАССЕМБЛЕРОМ. Если теперь записать на магнитную ленту только новый РЕДАКТОР (он располагается в памяти по адресам 0000Н — 7FFH), то, загрузив старый пакет «МИКРОН», а затем новый РЕДАКТОР, вы получите новый пакет с РЕДАКТОРОМ и АССЕМБЛЕРОМ.

Чтобы разобраться, как работать с пакетом программ DIS. «МИКРОН» проследим процесс дизассемблирования какой-либо программы, так сказать, «вручную». Он состоит из двух основных этапов: собственно дизассемблирования и расстановки меток. Дизассемблируя программу, обычно записывают в столбик сначала адрес команды, затем код операции с необходимыми операндами и, наконец, мнемоническое обозначение команды (адреса, конечно, можно и не записывать, но при последующей расстановке меток это может привести к путанице). Записав, таким образом, текст программы, для более удобного чтения и понимания алгоритма ее работы, вместо абсолютных адресов переходов нужно расставить метки. После всех этих операций текст программы (но, естественно, без адресов) можно с помощью РЕДАКТОРА (предварительно отредактировав, внеся в него пояснения или дополнения) ввести в компьютер и оттранслировать АССЕМБЛЕРОМ.

Всю описанную выше работу может выполнить DIS. «МИКРОН» во много раз быстрее и точнее, создавая текст дизассемблируемой программы непосредственно в области ОЗУ, отведенной для буфера текста редактора ED."МИКРОН". Программа DIS. «МИКРОН» также как и АССЕМБЛЕР, используется вместе с РЕДАКТОРОМ и располагается в памяти на месте АССЕМБЛЕРА, то есть с адреса 800Н по FFFH. Так же, как и ранее, переход из РЕДАКТОРА в ДИЗАССЕМБЛЕР и наоборот осуществляется нажатием клавиши СТР. В МОНИТОР можно выйти только из РЕДАКТОРА, нажав клавиши УС и Е.

Прежде чем приступать к дизассемблированию программы, необходимо ее коды поместить в область ОЗУ, которая для АССЕМБЛЕРА являлась областью трансляции и расположена с адреса 1100Н. Перемещение производят директивой Т МОНИТОРА, после чего можно приступить к дизассемблированию.

При входе в ДИЗАССЕМБЛЕР (из МОНИТОРА по директиве G800, а из РЕДАКТОРА нажатием клавиши СТР) на экране появляется сообщение:

DIS.*МИКРОН* КОНЕЦ ТЕКСТА...

Вместо точек будет выведено шестнадцатеричное число, соответствующее адресу конца текста в буфере. Эта информация необходима для определения свободного места в области ОЗУ, отводимой под текст и определяемой как разность адреса настройки указателя стека (73FFH) и адреса конца текста. Затем появляется символ «*», приглашающий оператора ввести директиву ДИЗАССЕМБЛЕРА. Их всего четыре:


  • D — дизассемблирование,
  • М — расстановка меток в дизассемблированном тексте,
  • А — удаление из текста адресов и
  • СТР — выход в РЕДАКТОР.

После задания директивы D на экран выводится запрос «РАБОЧИЙ АДРЕС», на который нужно ответить вводом полного шестнадцатеричного адреса (со всеми незначащими нулями) той области ОЗУ, в которой работает дизассемблируемая программа. Если при вводе адреса будет нажата клавиша, не соответствующая шестнадцатеричной цифре, то запрос ввода адреса будет повторен, а если клавиша СТР, то ДИЗАССЕМБЛЕР перейдет в режим ожидания ввода директив.

Далее на экране дисплея появится запрос ТЕКСТ (Y/N)? Что это означает? Дело в том, что в большинстве программ, кроме непосредственно кодов операций и операндов, присутствуют какие-либо данные. Ими могут быть подготовленные программистом заранее и расположенные в теле программы строковые константы, таблицы и т. п. Адреса, в которых расположены строковые константы, можно найти, воспользовавшись директивой L МОНИТОРА. (Следует отметить, что определить адреса таблиц и т. п. не всегда бывает просто — для этого может потребоваться многократное дизассемблирование программы и ее детальный анализ). Определив каким-либо образом эти области, на запрос ТЕКСТ (Y/N)? следует ответить нажатием клавиши Y, и на последующие запросы НАЧАЛО: и КОНЕЦ: вводом адреса начала и конца областей данных (DIS. «МИКРОН» позволяет определить до 32 областей данных).

После определения всех областей нужно на очередной запрос НАЧАЛО: ответить нажатием клавиши ВК (тем самым будет закончено их определение), и на экране появится запрос NEW (Y/N)? Ответ Y приведет к очистке буфера текста, и текст будет создаваться сначала. Любой другой ответ сохранит имеющийся в буфере текст, а вновь создаваемый пристыкует к нему (в некоторых случаях это может оказаться полезным).

После всех этих процедур остается на запрос АДРЕС: ввести полный адрес начала дизассемблируемого фрагмента (Адрес вводят АБСОЛЮТНЫЙ, то есть соответствующий той области памяти, в которой работает дизассемблируемая программа). Как только адрес будет введен, на экране появятся 24 строки дизассемблированного фрагмента, причем формат строки будет таким: сначала выводятся четыре символа адреса кода операции, затем четыре пробела (на их место в дальнейшем могут быть поставлены метки), следующие четыре позиции отводятся под мнемонику команды и одна позиция на разделительный пробел, за которым располагаются операнды (если они имеются в данной команде). О таком позиционировании следует помнить при редактировании дизассемблированного текста. В случае его нарушения директивы М и А дизассемблера могут выполниться не полностью.

Вывод фрагмента всегда заканчивается вопросом ТЕКСТ (Y/N)? Нажатие клавиши Y приведет к записи этого фрагмента в буфер текста и дизассемблированию следующей части программы. При нажатии клавиши N или любой другой (кроме СТР) дизассемблированный фрагмент в буфер текста записан не будет, но дизассемблирование следующего фрагмента произойдет. Если нажать клавишу СТР, то дизассемблированный фрагмент в буфер текста записан не будет и последовательное дизассемблирование также будет прекращено. На экране появится запрос АДРЕС?, в ответ на который можно ввести новое значение адреса, с которого следует вести дизассемблирование. или нажать еще раз клавишу СТР для завершения работы директивы D.

После ввода директивы М дизассемблер выдает запрос СИМВОЛ:, требующий ввода символа (буква латинского алфавита), который будет использован в качестве первого в именах всех расставляемых в тексте меток, два других символа — двухразрядное шестнадцатеричное число от 00 до 0FFH. Таким образом, максимальное число меток, которое может быть расставлено ДИЗАССЕМБЛЕРОМ, — 256. Если при выполнении директивы М количество меток превысит эту величину, то будет выведено сообщение МНОГО МЕТОК и работа директивы М прекратится. В этом случае можно разбить программу на части и вновь провести дизассемблирование.

После окончания работы директивы М будут выведены начальное сообщение и адрес конца текста в буферы, a DIS. «МИКРОН» перейдет в режим ожидания ввода директив.

Теперь можно ввести директиву А, результат работы которой - удаление всех адресов, расположенных в первых четырех позициях каждой строки. После проведенных операций будет создан текст программы, который может быть оттранслирован АССЕМБЛЕРОМ ASSM."МИКРОН" Приведем несколько примеров применения директив при дизассемблировании части самой программы ДИЗАССЕМБЛЕР. Предварительно директивой МОНИТОРА Т 800, FFF, 1100 эта программа была помещена в область трансляции (см. табл. 3, табл. 4, табл. 5).

Таблица 3.

DIS."МИКРОН* КОНЕЦ TEKCTA: 2101H 
*D 
РАБОЧИЙ АДРЕС? 0800 
ТЕКСТ(Y/N)? N 
NEW(Y/N) Y 
АДРЕС?0800 

0800  LXI  H,73FF 
0803  LXI  D,2100 
0806  SPHL 
0807  XCHD 
0808  MOV  A,M 
0809  XNR  A 
080A  JZ   0817 
080D  INX  H 
080E  CALL 08D9 
0811  JNZ  0808 
0817  LHLD 0804 
081A  SHLD 1000 
081A  INR  A 
081В  STA  1012 
081E  SHLD 1002 
0821  LXI  H,0E17 
0824  CALL 0E11 
0827  PUSH H 
0828  LHLD 1000 
082В  MOV  D,H 
082C  MOV  E,L 
082D  CALL 0DEF 
0830  XCHG 

ТЕКСТ(Y/N)?Y 
ДАЛЕЕ ВЫВОД НА ЭКРАН СЛЕДУЮЩЕГО ФРАГМЕНТА ЗАКАНЧИВАЮЩЕГОСЯ ТАК ЖЕ ВОПРОСОМ: 
TEKCT(Y/N)?<CTP> 
АДРЕС?<СТР> 
DIS."МИКРОН" KOHEЦ TEKCTA: 2286H 

Таблица 4.

0800        LXI   H,L00 
0803        LXI   D,L01 
0806        SPHL 
0807        XCHG 
0808 L04:   MOV   A,M 
0809        INR   A 
080A        JZ    L02 
080D        INX   H 
080E        CALL  L03 
0811        JNZ   L04 
0814        LHLD  L05 
0817 L02:   SHLD  L06 
081A        INR   A 
081B        STA   L07 
081E        SHLD  L08 
0821        LXI   H,L09 
0824        CALL  L0A 
0827        PUSH  H 
0828        LHLD  L06 
082B        MOV   D,H 
082C        MOV   E,L 
082D        CALL  L0B 
0830        XCHG  
     L00:   EQU   73FFH 
     L01:   EQU   2100H 
     L03:   EQU   08D9H 
     L05:   EQU   0804H 
     L06:   EQU   1000H 
     L07:   EQU   1012H 
     L08:   EQU   1002H 
     L09:   EOU   0E17H 
     L0A:   EQU   0E11H 
     L0B:   EQU   0DEFH 

Таблица 5.

           LXI   H,L00
           LXI   D,L01
           SPHL 
           XCHG
L04:       MOV   A,M
           INR   A
           JZ    L02
           INX   H
           CALL  L05
           JNZ   L04
           LHLD  L05
L02:       SHLD  L06
           INR   A
           STA   L07
           SHLD  L08
           LXI   H,L09
           CALL  L0A
           PUSH  H
           LHLD  L06
           MOV   D,H
           MOV   E,L
           CALL  L0B
           XCHG
L00:       EQU   73FFH
L01:       EQU   2100H
L03:       EQU   08D9H
L05:       EQU   0804H
L06:       EQU   1000H
L07:       EQU   1012H
L08:       EQU   1002H
L09:       EQU   0E17H
L0A:       EQU   0E11H
L0B:       EQU   0DEFH

ПОЛУЧЕННЫЙ ТЕКСТ MOЖET БЫТЬ ОТТРАНСЛИРОВАН АССЕМБЛЕРОМ ASSM. «МИКРОН». По директиве СТР можно перейти в РЕДАКТОР и редактировать дизассемблированный текст на любом этапе работы. Делать, однако, это нужно осторожно из-за особенностей выполнения директив М и А. Так директива М работает со строго позиционированными строками текста, о чем уже упоминалось. Например, если числовой операнд в трехбайтовой команде сместить при редактировании в любую сторону на любое число позиций, то он не будет заменен на метку, а сохранит свое значение (в некоторых случаях это может оказаться полезным).

Если вы редактируете текст перед применением директивы А, следует иметь в виду, что при ее выполнении DIS. «МИКРОН» удаляет первые четыре символа каждой строки, начинающейся с цифры или латинских букв А, В. С. D, Е, F. Так если в начале какой-либо строки будет поставлена метка CONST:. то после выполнения директивы А на ее месте в тексте останется только Т:. Строки, начинающиеся с любых других символов, останутся без изменений.

Для проверки правильности дизассемблирования рекомендуется провести трансляцию полученного текста программы, сравнить результат трансляции с исходной (используя директиву С МОНИТОРА), а затем модифицировать полученный исходный текст, дополняя его комментариями, псевдооператором ORG и т. д.

Новая версия РЕДАКТОРА ED."МИКРОН" дополнена средствами обработки дизассемблированных текстов. Все директивы ранее опубликованной версии сохранены. Версии отличаются только количеством позиций клавиши ТАБ (4 вместо 8) и порядком работы с директивой AP2+D. Теперь для удаления фрагмента текста необходимо пометить его начало нажатием клавиш AP2+D. переместить курсор на строку, следующую за удаляемым фрагментом, после чего ввести директиву АР2+Е (в прежней версии - AP2+D).

При запуске редактора по директиве G0 МОНИТОРА на экран выводится запрос NEW?. Если ответить Y. то будет очищен текстовый буфер и РЕДАКТОР перейдет в режим ввода текста. При нажатии любой другой клавиши РЕДАКТОР произведет анализ содержимого буфера на наличие признака конца текста и если не обнаружит его, выведет сообщение МАЛО ОЗУ и запрос NEW?, на который опять следует ответить Y. Если признак конца текста будет найден, то на экран выводится его начальный фрагмент (при наличии в буфере текста произвольной информации, заканчивающейся признаком конца текста, на экран будет выведена бессмысленная информация: не следует пытаться редактировать ее, так как это может привести к порче самого РЕДАКТОРА. Выйти из этой ситуации поможет директива AP2+N и нажатие на клавишу Y).

Теперь несколько слов о новых директивах РЕДАКТОРА.

AP2+S — занесение в промежуточный буфер помеченного фрагмента текста. Порядок работы при этом следующий. Начало запоминаемого фрагмента помечают директивой AP2+S. Курсор перемещают на строку, следующую за последней строкой запоминаемого фрагмента, и вводят директиву АР2+Е. Фрагмент текста будет запомнен в буфере, в качестве которого используется область трансляции. При попытке занесения в буфер слишком большого фрагмента будет выведено сообщение МАЛО ОЗУ.

АР2+Т — вставка запомненного фрагмента текста из временного буфера в редактируемый текст перед строкой, на которой расположен курсор.

AP2+L=Y — поиск и замена последовательности символов Х на последовательность Y. Если знак=и последовательность Y отсутствуют, то происходит только поиск последовательности X. Режим поиск/замена удобно использовать при замене имен меток, расставленных ДИЗАССЕМБЛЕРОМ, на имена, более полно отражающие смысл происходящего в программе.

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

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

При работе нового РЕДАКТОРА с АССЕМБЛЕРОМ или ДИЗАССЕМБЛЕРОМ следует помнить, что область трансляции используется в качестве временного буфера, поэтому, пользуясь директивой AP2+S, вы каждый раз уничтожаете содержимое области трансляции — результат ассемблирования или дизассемблируемую программу.

Таблица 6.

Адрес 0002 000E 0021 045D 00C8 0802 0805 0CA2 0DC1 0D48 0D66 0D80
32К 73 21 73 0F DF 73 21 74 74 74 76 74
16К 33 19 33 07 E7 33 19 34 34 34 36 34

Пакет «МИКРОН» предназначен для компьютера «Радио-86РК» с объемом ОЗУ в 32 Кбайт. В табл.6 приведены адреса ячеек памяти, содержимое которых нужно изменить для 16-килобайтной версии компьютера.

Таблица 7.

ОБЛАСТЬ ПАМЯТИ ВЕРСИЯ 16К ВЕРСИЯ 32К
РЕДАКТОР

ДИЗАССЕМБЛЕР
СЛУЖЕБНАЯ ОБЛАСТЬ
ОБЛАСТЬ ТРАНСЛЯЦИИ
БУФЕР ТЕКСТА
ВЕРШИНА СТЕКА
ТАБЛИЦА МЕТОК

0000Н — 07FFH

0800H — 0FFFH
1000Н — 1100Н
1100H — 18FFH
1900Н — СТЕК
33FFH
3400Н — 35FFH

0000Н — 07FFH

0800Н — 0FFFH
1000Н — 1100Н
1100H — 20FFH
2100Н — СТЕК
73FFH
7400Н — 75FFH

Распределение памяти для обоих версий компьютера приведено в табл.7.

В. БАРЧУКОВ, Е. ФАДЕЕВ

г. Москва