Voyager
#01
06 июля 1998 |
|
PROFI CLUB - DD80 - описание дискового ассемблера под CP/M.
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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября