Описание
компьютера Радио-86РК
|
Журнал
РАДИО
|
ДИЗАССЕМБЛЕР для "Радио-86РК".
Опубликованный пакет программ "Микрон" позволяет создавать прикладные программы на языке АССЕМБЛЕРА, однако нередко перед радиолюбителем возникает и обратная задача - по имеющимся кодам какой-либо программы воссоздать (дизассемблировать) ее текст на языке АССЕМБЛЕРА. Дизассемблирование может потребоваться, например, в случае утери первоначального исходного текста программы, для анализа и дополнения новыми возможностями программ, написанных другими программистами, для переноса рабочей области программы в другую область ОЗУ...
Между символическими командами языка АССЕМБЛЕРА и кодами машинах команд существует взаимно однозначное соответствие, поэтому, имея таблицу кодов команд микропроцессора, любую программу можно дизассемблировать вручную. Многие радиолюбители, чтобы понять, как работают программы, опубликованные в журнале, видимо, этим уже занимались и на собственном опыте убедились, сколь продолжителен и кропотлив этот труд.
Имея в руках такого помощника, как персональный компьютер, эту работу можно возложить на него, загрузив предварительно в его память программу ДИЗАССЕМБЛЕР. Она позволит с минимальными затратами времени создать текст любой программы на языке АССЕМБЛЕРА, который, естественно, в дальнейшем может быть оттранслирован с помощью АССЕМБЛЕРА ASSM. *МИКРОН*.
В табл.1 приведены машинные коды нового пакета программ "МИКРОН" который состоит из улучшенной версии РЕДАКТОРА ED."МИКРОН" и ДИЗАССЕМБЛЕРА DIS."МИКРОН". Каждая из этих программ занимает 2 Кбайт памяти и может работать независимо друг от друга. Новую версию РЕДАКТОРА можно объединить с АССЕМБЛЕРОМ ASSM."МИКРОН", заменив коды старого редактора на новые. Сделать это лучше следующим образом: пользуясь директивой М МОНИТОРА, введите в ОЗУ компьютера коды из табл.1 блоками по 256 Байт с последующей записью их на магнитную ленту и сверкой контрольной суммы записанного блока с контрольной суммой соответствующего блока из табл.2.
Таблица 2.
ОБЛАСТЬ ОЗУ |
КОНТР. СУММА |
ОБЛАСТЬ ОЗУ |
КОНТР. СУММА |
0000 - 00FF 0100 - 01FF 0200 - 02FF 0300 - 03FF 0400
- 04FF 0500 - 05FF |
1D46 6F40 5E2F CE8F 8D43 8826 98AD |
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 на экран выводится запрос "РАБОЧИЙ АДРЕС", на который нужно ответить вводом полного шестнадцатеричного адреса (со всеми незначащими нулями) той области ОЗУ, в которой работает дизассемблируемая программа. Если при вводе адреса будет нажата клавиша, не соответствующая шестнадцатеричной цифре, то запрос ввода адреса будет повторен, а если клавиша СТР, то ДИЗАССЕМБЛЕР перейдет в режим ожидания ввода директив.
Далее на экране дисплея появится запрос ТЕКСТ (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-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 |
|
CALLL |
05 |
|
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 |
ПОЛУЧЕННЫЙ ТЕКСТ MOIET БЫТЬ ОТТРАНСЛИРОВАН АССЕМБЛЕРОМ 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.
В. БАРЧУКОВ, Е. ФАДЕЕВ
г. Москва
Описание
компьютера Радио-86РК
|
Журнал
РАДИО
|