В общем, есть ассемблер, к нему я хочу добавить компоновщик, чтобы можно было нормально писать более-менее большие программы. Собственно, первой проблемой стал сам формат объектного файла. Далеко не конечный вариант можно посмотреть ниже, о нем и будет речь.
Код:
МЕТКИ
число меток
(
имя (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) Открывает следующий
Теперь подробнее про поправку адресов. По скольку, мы сшиваем несколько разных файлов в один, нам нужно поправить адреса. Для этого нужно просто к обрабатываему файлу добавить размеры предыдущих файлов, а точнее, только размеры секций кода, ведь сейчас мы работаем именно с ними. Добавлять мы будем в таблицу "МЕТКИ" к адресам объявления меток и позициям их использования.
С Сегментом данных такая же история.
Собственно, я все правильно делаю?
П.С. поясню, для тех, кому интересно. Пишем не большой командой проект, который включает в себя ВМ и оборудование, ассемблер, компоновщик, компилятор и ОС. Так уж получилось, что компоновщик, зараза, оказался самой магической частью из этого всего.