Disasm is a project mainly written in Assembly, it's free.
DOS .com files disassembler, written on TASM 4.1 for DOS (done for the university course)
Пример дизассемблера .COM-файлов для DOS. Написан на Turbo Assembler 4.1. Разрабатывается группой студентов исключительно в учебных целях.
Авторы управляющей части: Кравцов Дмитрий, [email protected] Харитонов Роман, [email protected]
Авторы модулей разбора инструкций: Гренкин Глеб — логические инструкции (and, or, xor, test, not) Елизаров Сергей — инструкции сложения (add, adc) Кравцов Дмитрий — пустая инструкция (nop), арифметические сдвиги (sal, sar) Пинчук Олег — инструкции деления (div, idiv) Харитонов Роман — условные переходы (jxx)
Тестирование и code review: Бураго Игорь Лукащук Максим Строкач Александр
Полезные ссылки: Assembler IBM PC: http://mini-soft.ru/book/assem/index.php TASM 3.0 Manual: http://www.citforum.ru/programming/tasm3r/index.shtml TASM Reference Book: http://www.codenet.ru/progr/asm/tasm/index.php DOS Function codes: http://spike.scu.edu.au/~barry/interrupts.html MS-DOS 5.0 Programmer's Reference: http://www.ousob.com/ng/dos5/index.php
FAQ для студентов 236 и 238 групп ИМКН ДВГУ:
Q: Какие программы нужны для работы? A: 1. Turbo Assembler for DOS (версии не ниже 4.1): http://cloud.github.com/downloads/refaim/disasm/TASM_4.1.ZIP
Q: Что нужно сделать, чтобы начать писать дизассемблер? A: 0. Скачать последнюю версию исходного кода: http://github.com/refaim/disasm/zipball/master
@echo off
SET TASM_PATH=C:/TASM/BIN
mingw32-make %*
------------------------------------------------------------------
Путь должен быть набран с использованием прямых ('/'), а не обратных ('') слешэй. Без завершающего слэша и без кавычек.
Q: Как скомпилировать дизассемблер? A: С помощью файла "make.bat". Как им пользоваться: "make [CFG=<debug|release>] [all|clean|debug|test]" all -- собрать дизассемблер, clean -- удалить все полученные в результате сборки файлы, debug -- собрать дизассемблер и открыть его в Turbo Debugger'е, test -- собрать тестовый пример test.asm. Все параметры опциональны. Запуск "make" без параметров аналогичен "make clean all CFG=debug". "CFG=debug" отличается от "CFG=release", как легко догадаться, наличием отладочной информации.
Q: Как это всё работает? A: Основная процедура main из файла main.asm читает байты из входного файла и в цикле вызывает пользовательские процедуры, которые осуществляют разбор. Имена процедур она берет из файла funcs.inc.
Q: А что за файл такой -- "main.asm"? Что с ним делать? A: Ничего. Он уже работает и трогать его не нужно, а то всё сломается.
Q: А "common.asm"? A: Его тоже трогать не надо. Но пользоваться определенными в нем процедурами можно.
Q: Куда же тогда писать мой код? A: В файл "p_<название_вашей_команды>.asm". Внутри него -- куда угодно. Главное, чтобы была экспортируемая (директивой public) процедура, имя которой записано в файле "funcs.inc".
Q: А что мне разбирать? Откуда брать байты? Куда класть результат? A: После передачи управления вашей процедуре в регистре si находится адрес буфера со входными данными (байтами из файла), а в регистре di адрес выходного буфера, куда нужно писать выходную строку. Выходная строка должна заканчиваться символом перехода на новую строку (LF, ASCII 10) и не должна содержать символа "$" (ASCII 36). Перед возвратом из процедуры вам нужно прибавить к регистрам si и di количество прочитанных и записанных байт соответственно. Если не удалось распознать команду, трогать эти регистры и писать что-либо в выходной буфер не нужно.
Q: Как быть с регистрами? A: Состояние регистров до вызова вашей процедуры должно совпадать с их состоянием после возврата (исключая регистры si и di, о которых написано выше). Сохранение регистров обеспечивается директивой uses в начале процедуры: "uses ax, bx, dx" (сохранять нужно только используемые регистры). Кто будет портить регистры, зачёта не получит, гарантирую.
Q: А что за директива "locals" в начале файла? A: Она позволяет создавать в процедурах локальные метки. Префикс, обозначающий локальность -- "@@" (например, "@@exit").
Q: Я всё прочитал, но ничего не понял. Что делать? A: Посмотреть примеры: "p_nop.asm" и "p_jxx.asm".
Q: Я написал свой дизассемблер, что теперь? A: Если вы уверены в его работоспособности, ЖЕЛАТЕЛЬНО отправить его авторам (см. выше — Авторы). Вам нужно отправить только модуль p_{имя_команды}.asm. После того как мы убедимся, что ваша программа работает корректно, мы включим её в официальную версию.