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

  • Автор темы Umberto
  • Дата начала
Статус
Закрыто для дальнейших ответов.
U

Umberto

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

Rififi

#2
Umberto

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

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

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

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

Umberto

#3
Оцените верность метода. Вот парочка кусков кода (упростил).
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?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Во-первых, замени fwrite(...) на fputc( ch, fp );
Во-вторых, что ты делаешь в первом примере я так и не понял. Откуда коды брешь?
 
U

Umberto

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