Цитата Сообщение от Sayman Посмотреть сообщение
В контексте больших программ - назрел вопрос. Когда код раздувается сильно, настаёт время задуматься о том, куда и как его перемещать. Поскольку можно включить в 0е окно проца ещё какую-то страницу, то хотелось бы туда скинуть часть сишного кода. Т.е. допустим, часть функций сидит в адресах 0x8000..., часть кода в 0x0000. На стадии загрузчика я бы мог скинуть этот код туда, в 0. Например, на старом асме M80 была такая директива .phase и .dephase, в ужасме есть аналогичная директива, благодаря которой код указанный внутри директивы собирается на указанный директивой адрес. соответственно, загрузчик этот код скидывает на нужный адрес. Если делать через org, то в бинарном файле дует овердофига нулей. Какие есть вариант при помощи sdcc разогнать части кода по памяти по разным, каким мне надо адресам?
Я поппытался решить эту проблему в SDCC-NOINIT. В процессе (ещё до конца не доделано).

Идеология такая: имеется "перемещаемая библиотека", которую можно загрузить с любого адреса, кратного 0x100. Она содержит в себе функции и таблицу перемещений.
При загрузки библиотеки она настраивается на адрес загрузки.

В основной программе хранится специальная маленькая процедурка, которая позволяет вызвать функцию по любому адресу. Эта процедурка настраивается при загрузки библиотеки.

То есть библиотека представлена в виде двух файлов:
1. Загружаемый .bin модуль - собственно библтотека.
2. Встраиваемая в основную программу часть библиотеки .rel.

Вызов функций из основной программы - прозрачный. То есть не надо самому переключать странички, что-то настраивать. При загрузки библиотеки всё настраивает загрузчик.

В принципе - работает. Но есть нюансы.

Самое сложное было автоматизировать генерацию кода для вызовов. Но bash справился