C) A.N.D.Y.
Music: LASERDREAM (C) Mr.Z/LS (R) DGN
───────────────────────────────────────────────────
╔═════════════╗
║ ║
║ DD80 ║
║ ║
╚═════════════╝
Дизассемблер DD80 является, пожалуй, самым
мощным среди программ своего класса. Несмотря на
то, что он является консольным и написан для опе-
рационной системы CP/M, его с успехом можно исполь-
зовать и для программ, написанных в других ОС. За
три года использования в своей работе DD80, я дос-
таточно полно изучил его возможности и хочу поде-
литься своим опытом...
* * *
ИДЕОЛОГИЯ
═══════════
DD80 представляет просто безграничные воз-
можности, чего не может ни один другой дизассемб-
лер. Те, кто работал с подобным режимом в STS, ду-
маю, больше не будут этого делать. :)
Принципиальным отличием DD80 является то,
что он при своей работе составляет карту файла. В
этой карте показывается распределение памяти на бло-
ки, которые бывают 3 видов: CODE, DATA, STORAGE.
Первые два объяснять, наверное, не нужно; третий
вид - то, что при ассемблировании объявляется как
DEFS, т.е. зарезервированная область. Эту карту мож-
но записывать на диск и считывать обратно, добав-
лять в нее и удалять из нее куски и т.п. Но об этом
немного позже. Второй приятной особеностью DD80
является полу-, а в некоторых случаях и полностью
автоматический режим работы. Такого я нигде больше
не видел. После составления карты окончательное
дизассемблирование производится на диск в формате
текстового файла с альтернативной кодировкой. Туда
же выводится вся служебная информация. К недостат-
кам программы можно отнести отсутствие какой бы
то ни было работы с половинками индексных регист-
ров. :( Еще сказывается недостаток консольной реали-
зации (нет окон; когда карта состоит из множества
блоков, она скроллируется на два-три экрана и т.д.).
* * *
ОПИСАНИЕ КОМАНД
═══════════════════
После запуска на экране появляется надпись:
Дизасемблер готов к вводу команд, состоящих
из трех букв. Список доступных команд можно полу-
чить, набрав HLP. Все команды делятся на пять ти-
пов:
1. DISASSEMBLY COMMAND
2. MAP AND SYMBOL TABLE COMAND
3. FILE DEFINITION COMAND
4. FORMAT COMMANDS
5. SPECIAL FUNCTION COMMANDS
FILE DEFINITION COMMANDS
───────────────────────────
Я не случайно начинаю обзор команд DD80 с
этой группы, несмотря на то, что в HELP'е им отве-
ден 4-й пункт. Эта группа команд выполняет главные
действия, без которых и работа будет невозможна.
Всего здесь пять команд:
DSK [drive:] filename - присоединить файл. Все вво-
дится без пробелов; параметр drive: необязателен,
если файл находится на текущем диске.
OUT drive: - выбор диска для записи карты и листинга.
EXC addr - установка стартового адреса файла. По
умолчанию файлы в операционной системе CP/M на-
чинаются с адреса #0100.
LOC - actual file location.
ADR - display input file address.
DISASSEMBLY COMMANDS
────────────────────────
14 команд этой группы управляют режимом ди-
зассемблирования программы.
DAS [adr1] [adr2] - дизассемблирование с выводом на
экран листинга программы. Если параметр adr2 от-
сутствует, то процесс завершается, когда будет
встречена одна из команд JP ADDR, JP (HL), RET,
HALT. Если пропущен параметр adr1, то дизассемб-
лирование происходит с текущего адреса. В таком
случае можно просто нажимать <ESC>. Отработанный
участок программы будет занесен в карту и поме-
чен как CODE.
TAB [adr1] [adr2] - заносит область памяти в карту
и помечает ее как данные (DATA).
STG [adr1] [adr2] - объявляет данный блок памяти как
STORAGE.
DMC
DMT - соответствующие операции без вывода на экран.
DMS /
XMC
XMT - удаление соответствующих блоков из карты.
XMS /
GMC [adr] - глобальное дизассемблирование. DD80 на-
чинает дизассемблирование с заданного адреса. Пос-
ле окончания обработки главной части файла (т.е. ко-
гда будет встречена одна из команд, останавливаю-
щих процесс) из таблицы необработанных адресов вы-
бираются адреса, помеченые звездочкой, и процесс
продолжается. Когда все ветви программы будут об-
работаны, все блоки кодов будут отмечены в карте.
GMT - заносит в карту как DATA все блоки, присут-
ствующие в таблице адресов.
GMS - помечает все то, что осталось после отработ-
ки команд GMC и GMT, как STORAGE.
Таким образом, можно дизассемблировать прог-
рамму путем ввода всего трех команд! Но не радуй-
тесь слишком сильно, т.к. тут есть свои подводные
камни. О них читайте в конце статьи.
Следующие две команды выполняются после того,
как будет составлена вся карта памяти программы:
FAS - команда окончательного (FINAL) дизассемблиро-
вания с выводом на экран. Диск зажужжит, а Вы мо-
жете сходить попить чаю или перекурить.
FMD - то же, но без вывода на экран и гораздо быс-
трее. :)
В результате финального дизассемблирования на
диске создается ASCII файл в альтернативной коди-
ровке. Выглядит он примерно так:
MAP AND SYMBOL TABLE COMMANDS
───────────────────────────────────
Эта группа выполняет операции с картой и со-
стоит из шести команд:
NEW - очистка карты. Необходима, если Вы нагороди-
ли с картой такое, что обычными командами удале-
ния блоков из карты (типа XMC) уже не исправить.
MAP - вывод карты на экран. Снизу экрана начинает
ползти список блоков, разбитый на три колонки:
CODE, DATA, STORAGE. Вслед за этим появится таб-
лица неопределенных адресов (UNRESOLVED SYMBOL
TABLE). Увидев в этой таблице адрес, помеченный
звездочкой, смело дизассемблируйте с этого адреса.
SYM - вывод на экран полной таблицы адресов. Здесь
будут появляться и те адреса, которые уже отра-
ботаны, и те, которые еще нет.
REF - переформирование таблицы адресов Эту коман-
ду необходимо применить после удаления каких-либо
блоков из карты. В процессе отработки этой коман-
ды заново перетрассируются все CODE-участки про-
граммы.
SVM - запись карты на диск (текущий или установ-
ленный командой OUT). В результате на диске появ-
ляется файл filename.MAP, занимающий совсем немно-
го места, но хранящий всю информацию об исходном
файле.
LDM - соответственно загрузка карты с диска.
Таким образом, можно дизассемблировать файл
и записать его на диск, а если распределение блоков
неправильное, то надо просто загрузить DD80, счи-
тать карту, исправить "ошибки" и повторить дизас-
семблирование. Никаких мучений!
FORMAT COMMANDS
──────────────────
В этой группе содержатся сервисные команды,
не очень-то и необходимые, но полезные. Их шесть:
D80 - использовать набор команд процессора INTEL
8080. Это где вместо LD A, (DE) пишется LDAX D
(те, кто писал на ассемблере 8080, поймут меня).
D85 - использовать набор команд процессора 8085.
Честно говоря, такие команды и в кошмарном сне
не приснятся. ;)
Z80 - использовать набор команд Z80.
LIN - количество символов в строке консоли (шест-
надцатиричное число не больше #50=80).
DEL - переназначение клавиши для удаления символов.
BSC - то же самое, но для клавиши BACKSPACE.
SPECIAL FUNCTION COMMANDS
─────────────────────────────
В этой группе содержится четыре команды об-
щего назначения:
HLP - как уже упоминалось, вызов справки.
END - окончание работы и выход в CP/M. Такой же
эффект дает комбинация клавиш <CTRL>+<C>.
SAV line - записывает в память строку line, кото-
рую можно потом вызвать нажатием <CTRL>+<R>.
DUM [addr] - вывод дампа памяти с адреса addr. Ес-
ли параметр отсутствует, то выводится содержимое
памяти с текущего адреса. В таком случае, можно
просто нажать <ENTER>.
* * *
ИЗ НЕДОКУМЕНТИРОВАННОГО
════════════════════════════
Размер таблицы символов, определенный по умол-
чанию, мне, к сожалению, не известен. Его постоянно
не хватает, и периодически DD80 спрашивает, можно
ли ее расширить. Выглядит это примерно так:
Увидев такое сообщение, смело отвечайте "Y"; ничего
страшного не случится.
Когда в программе встречается какая-либо ко-
манда, оперирующая с половинками индексных регист-
ров, DD80 остановит дизассемблирование и напишет:
Против этого помогает только "шаманский" способ: оп-
ределить байт #DD или #FD как DATA, а затем про-
должить дизассемблирование со следующего адреса. Не
забудьте потом все исправить!
Если будете увлекаться использованием глобаль-
ных команд типа GMC и GMT, то можете нарваться
на следующее обстоятельство: часть файла, помечен-
ная вами как DATA, на самом деле может быть ис-
полнимым кодом, о чем DD80 вас и предупредит. Это
будет что-то типа:
Как я понял, DD80 в процессе отработки команды
GMT проверяет, есть ли вызовы (команды JP, CALL)
в эту область. Это еще раз доказывет, что DD80 -
"умная" программа.
* * *
НЕСКОЛЬКО ПОЛЕЗНЫХ СОВЕТОВ
════════════════════════════════
1) Многие программисты пишут программы в таком
стиле:
LD DE, SCR_ADR
CALL PRINT
DATA DEFB "Привет, друзья!", #00
LD HL, TABLE
...
PRINT POP HL
...
При обычном дизассемблировании командой DAS с од-
ним параметром (или вообще без параметров) полу-
чится сами понимаете что. Поэтому для того, чтобы
данные не попали в область CODE, после обнаружения
подпрограммы, которая первым же делом что-то сни-
мает со стека, находите все ее вызовы и аккуратно
дизассемблируйте командой DAS с двумя параметрами.
2) Часто при написании программ на ассемблере ис-
пользуется следующий прием: в зависимости от зна-
чения регистра (или регистровой пары) из таблицы
значений выбирается адрес; далее чаще всего идет
команда JP (HL). Как вы уже наверное догадались,
случай почти клинический. Ссылок на адреса подпрог-
рамм DD80 не обнаружит. Помочь тут может только
промежуточное дизассемблирование. После того, как
вы найдете эту_самую_чертову_таблицу, запишите на
бумажку список адресов, и грузите опять DD80. Не-
много коряво, но, поверьте, помогает.
3) Для того, чтобы дизассемблировать программу,
которая не работает в CP/M, надо:
а) перенести ее из TR-DOS на диск в системе
CP/M (с помощью CopyK, Hop Commander'а или
подобных.);
б) поменять расширение .CTR на .COM (иначе ни-
чего вообще не получится).
в) после запуска DD80 и подключения файла, ввес-
ти команду EXC addr, т.е. задать адрес запус-
ка вашей (или не вашей) программы.
г) дальше - все как обычно.
4) И последнее. Все операции хорошо проделывать,
предварительно скопировав все файлы на RAM-диск.
Ощущения незабываемые: диск не жужжит, работа не
тормозится...
* * *
P.S. Вот, кажется, и все. Если чего забыл, напишу в
следующем номере. На диске в ПРИЛОЖЕНИИ вы най-
дете программу в виде файла DD80.C, который надо
перенести на CP/M-диск и переименовать в .COM-файл.
С помощью DD80 можно сделать очень многое. Напри-
мер, когда-то давно я составил исходники DIZZY 3.5
и DRILLER.
───────────────────────────────────────────────────
На диске в ПРИЛОЖЕНИИ вы най-
дете программу в виде файла DD80.C, который надо
перенести на CP/M-диск и переименовать в .COM-файл.
С помощью DD80 можно сделать очень многое. Напри-
мер, когда-то давно я составил исходники DIZZY 3.5
и DRILLER.
───────────────────────────────────────────────────
hx