Радио-86РК/Радио 03-88/Дизассемблер
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: В. БАРЧУКОВ, Е. ФАДЕЕВ Источник: http://retro.h1.ru/RK86/Edit/DizAsm.php |
Опубликованный пакет программ «Микрон» позволяет создавать прикладные программы на языке АССЕМБЛЕРА, однако нередко перед радиолюбителем возникает и обратная задача — по имеющимся кодам какой-либо программы воссоздать (дизассемблировать) ее текст на языке АССЕМБЛЕРА. Дизассемблирование может потребоваться, например, в случае утери первоначального исходного текста программы, для анализа и дополнения новыми возможностями программ, написанных другими программистами, для переноса рабочей области программы в другую область ОЗУ…
Между символическими командами языка АССЕМБЛЕРА и кодами машинах команд существует взаимно однозначное соответствие, поэтому, имея таблицу кодов команд микропроцессора, любую программу можно дизассемблировать вручную. Многие радиолюбители, чтобы понять, как работают программы, опубликованные в журнале, видимо, этим уже занимались и на собственном опыте убедились, сколь продолжителен и кропотлив этот труд.
Имея в руках такого помощника, как персональный компьютер, эту работу можно возложить на него, загрузив предварительно в его память программу ДИЗАССЕМБЛЕР. Она позволит с минимальными затратами времени создать текст любой программы на языке АССЕМБЛЕРА, который, естественно, в дальнейшем может быть оттранслирован с помощью АССЕМБЛЕРА ASSM. *МИКРОН*.
В табл.1 приведены машинные коды нового пакета программ «МИКРОН» который состоит из улучшенной версии РЕДАКТОРА ED."МИКРОН" и ДИЗАССЕМБЛЕРА DIS. «МИКРОН». Каждая из этих программ занимает 2 Кбайт памяти и может работать независимо друг от друга. Новую версию РЕДАКТОРА можно объединить с АССЕМБЛЕРОМ ASSM."МИКРОН", заменив коды старого редактора на новые. Сделать это лучше следующим образом: пользуясь директивой М МОНИТОРА, введите в ОЗУ компьютера коды из табл.1 блоками по 256 Байт с последующей записью их на магнитную ленту и сверкой контрольной суммы записанного блока с контрольной суммой соответствующего блока из табл.2.
Таблица 2.
ОБЛАСТЬ ОЗУ | КОНТР. СУММА | ОБЛАСТЬ ОЗУ | КОНТР. СУММА |
0000 — 00FF 0100 — 01FF |
1D46 6F40 |
0800 — 08FF 0900 — 09FF |
2BC4 CB8B |
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 |
0000Н — 07FFH 0800Н — 0FFFH |
Распределение памяти для обоих версий компьютера приведено в табл.7.
В. БАРЧУКОВ, Е. ФАДЕЕВ
г. Москва