Создание .com файла

Тема в разделе "Общие вопросы по С и С++", создана пользователем Umberto, 20 дек 2010.

Статус темы:
Закрыта.
  1. Umberto

    Umberto Гость

    Дано задание: через консоль набираются строки ассемблерного кода. Требуется разработать ассемблер для формирования выполняемого файла .сом формата. Реализовать на Си.
    Как я понимаю алгоритм для одной строки кода(упрощённо):
    1) Читать строку
    2) Разбить команду её на составляющие и перевести в двоичный код
    3) ???
    4) Записать переменную в файл .com, открыв его в двоичном режиме
    По воводу п.3. Предлагают:
    1) Разбить получившийся в п.2 двоичный код на куски по байту (8 знаков)
    2) Перевести каждый кусок в десятичное число
    3) Записать это число в переменную типа unsigned char
    Но конкретно мне это не совсем понятно. Согласны ли вы с предложением по п. 3? Буду рад вашему решению.
    Заранее благодарю.
     
  2. Rififi

    Rififi Гость

    Umberto

    Согласны ли вы с предложением по п. 3?

    третий пункт в этом алгоритме - лишний. он вообще непонятно что делает.
    а в целом - верной дорогой идёте, товарищ.
    список команд и их формат искать на http://www.intel.com/products/processor/manuals/ или в гоогле

    правда объём работы будет немаленький, даже учитывая что это только com-файл, а значит отсутствие таблицы перемещений и 16-битный реалмод в dos

    можно взять старые версии nasm и украсть оттуда движок. может препод и не заметит :)
     
  3. Umberto

    Umberto Гость

    Оцените верность метода. Вот парочка кусков кода (упростил).
    Код (C++):
    for(i=0; i<8; i++)
    {
    ch|=code[i];
    ch<<=1;//смещение
    }
    char ch;
    int code[] - массив, где хранятся единички и нолики. Не очень умно хранить в int, но есть как есть.
    В результате этих операций у нас создаётся правильный байт ch.
    Код (C++):
    FILE *fp;
    fp=fopen("test.com","wb");//открытие файла для записи в двоичном режиме
    fwrite(ch,1,1,fp);//запись байта
    fclose(fp);
    Работает всё хорошо, но только в ch не пишется ничего, вот такая вот бида. Что я скодил не так в куске 1?
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Во-первых, замени fwrite(...) на fputc( ch, fp );
    Во-вторых, что ты делаешь в первом примере я так и не понял. Откуда коды брешь?
     
  5. Umberto

    Umberto Гость

    Я плохо понимаю эту тему сам. Так что по совету одногрупника передаю данные в двоичный файл, используя массив "правильных байтов". В первом примере я как раз создаю из восьми знаков правильный байт.
    С помощью нескольких созданных функций. Не посчитал нужным это расписывать. В итоге у меня коды помещаются в массив int code[].
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    И что в итоге получается?
     
  7. Umberto

    Umberto Гость

    Пока ничего путного. Com-файл создаётся нужного размера, но заполняется нулями.
    А чем плоха fwrite?
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей