Giter Club home page Giter Club logo

disasm's Introduction

Пример дизассемблера .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
   2. MinGW Make: http://github.com/downloads/refaim/disasm/mingw-make-win32.zip

Q: Что нужно сделать, чтобы начать писать дизассемблер?
A: 0. Скачать последнюю версию исходного кода: http://github.com/refaim/disasm/zipball/master
   1. В файле make.bat указать путь к TASM на вашем компьютере.
        Пример файла make.bat:
        ------------------------------------------------------------------
        @echo off
        SET TASM_PATH=C:/TASM/BIN
        mingw32-make %*
        ------------------------------------------------------------------
        Путь должен быть набран с использованием прямых ('/'), а не обратных ('\') слешэй. Без завершающего слэша и без кавычек.
    2. Переименовать файл example.asm в p_<название_вашей_команды>.asm. Например: p_jmp.asm, p_mov.asm, p_xor.asm. Префикс "p_" нужен для того, чтобы ваш файл был автоматически подключен при сборке проекта утилитой make. Будьте осторожны: TASM для DOS умеет понимать только имена файлов стандарта 8.3 (не более 8 символов на имя, не более 3 символов на расширение).
    3. В полученном файле переименовать процедуру parse в parse_<название_вашей_команды>. Например: parse_jmp, parse_add.
    4. Дописать полученное имя процедуры в файл funcs.inc, отделив его запятой от уже имеющихся там имён.
        Пример файла funcs.inc:
        ------------------------------------------------------------------
        FUNCS equ parse_jxx, parse_nop, parse_add
        ------------------------------------------------------------------

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. После того как мы убедимся, что ваша программа работает корректно, мы включим её в официальную версию.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.