OSDev

для всех
Текущее время: 30 апр 2024, 02:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 04 июл 2014, 11:36 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
В общем, есть ассемблер, к нему я хочу добавить компоновщик, чтобы можно было нормально писать более-менее большие программы. Собственно, первой проблемой стал сам формат объектного файла. Далеко не конечный вариант можно посмотреть ниже, о нем и будет речь.
Код:
МЕТКИ
  число меток
  (
    имя (zero-terminated),
    позиция объявления в файле,
    число использований метки
    (
      позиция использования, размер значения (8/16 бит)
    )
  )

КОД
  Код, че тут добавить. Там, где юзаются метки, просто забиты нули

ДАННЫЕ
  Данные, ни чего интересного
 

Пример:
  МЕТКИ
    2    // Число меток
    LABEL 0 // Имя метки 1
    123    // Позиция объявления
    3    // Кол-во использований это метки
    10, 8  // Пары позиция использования, размер
    15, 16
    56, 8
   
    LAB2  // Имя метки 2
    56    // Позиция объявления
    2    // Кол-во использований это метки
    34, 8  // Пары позиция использования, размер
    87, 8
   
КОД
  ...

ДАННЫЕ
  ...

Заметьте, ниже речь только о сегменте кода, т.к. сегмент данных будет обрабатывать отдельно, но по той же схеме.

Как я представляю работу этого чуда:
1) Компоновщик открывает очередной файл. Делает поправку адресов (это если были открыты какие то файлы ранее)
2) Собственно, пишет в результирующий файл уже поправленные адреса
3) Открывает следующий

Теперь подробнее про поправку адресов. По скольку, мы сшиваем несколько разных файлов в один, нам нужно поправить адреса. Для этого нужно просто к обрабатываему файлу добавить размеры предыдущих файлов, а точнее, только размеры секций кода, ведь сейчас мы работаем именно с ними. Добавлять мы будем в таблицу "МЕТКИ" к адресам объявления меток и позициям их использования.

С Сегментом данных такая же история.

Собственно, я все правильно делаю?

П.С. поясню, для тех, кому интересно. Пишем не большой командой проект, который включает в себя ВМ и оборудование, ассемблер, компоновщик, компилятор и ОС. Так уж получилось, что компоновщик, зараза, оказался самой магической частью из этого всего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 17:11 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Вроде всё верно.

Не рекомендую делать 0 терминальные строки. Это затрудняет обработку требуя двух проходности и тем самым замедляя разбор. Лучше совмещенный метод указания длины затем строка терминированная нулём. Популярным форматом для хранения строк является UTF-8 так что советую уточнить один ноль, два или четыре. И указать тип строки и для одно байтовой кодовую страницу.

Компоновщик вещь легкая. Известен входной формат известен выходной. А промежуточный можете делать каким хотите. Это не такая задача над которой надо задумываться.
Надо 2 прохода делаете два надо три делаете 3 прохода.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 17:31 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
Цитата:
Вроде всё верно.

Благодарю за ответ. Пишу по чуть-чуть =)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 18:39 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Если написали ассемблер - то компоновщик, по идее вообще не вопрос.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 18:42 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
iz56 писал(а):
Если написали ассемблер - то компоновщик, по идее вообще не вопрос.

Ахах, я и компилятор Сишки писал :lol: Простой, очень, как SmallC, но все же.

Просто я ни когда с компоновщиком не сталкивался раньше, знал что он есть, и все.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 19:09 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
iz56 писал(а):
Если написали ассемблер - то компоновщик, по идее вообще не вопрос.


Простой -- да, а вот продвинутый может быть весьма и весьма сложным. Ещё сильно зависит от архитектуры процессора. Под IA-32, например, он куда проще, чем под ARM.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2014, 19:21 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
А чем существующие форматы не устраивают, к примеру Object ELF?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 июл 2014, 17:41 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
phantom-84 писал(а):
А чем существующие форматы не устраивают, к примеру Object ELF?

Да я даже не слышал о нем, по этому и спросил вот.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB