Ответ: Линковщик не генерирует код. Он просто берет данные из разных модулей и собирает все в одну программу.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 21 августа 2003 г. 15:40
В ответ на: В чем идея создания сегментов у IAR, Почему бы линковщику не сгенирить весь код в одном сегменте, зачем нужно распределять данные в один сегмент код в другой , прерывания в третий. В чем преимущество? отправлено JTAG 21 августа 2003 г. 14:57

А распределение данных по сегментам делает или компилятор или программист.
А сегментация программы как раз и обуславливается тем, что данные с разным назначением удобнее располагать в разных сегментах. При этом одни данные должны располагаться по фиксированным адресам (например, вектора прерываний) и они размещаются в соотвтствующем сегменте. Другие могут быть размещены произвольно и компилятор (или программист) размещает их в перемещаемые сегменты. Линкер на этапе сборки программы размещает их по физическим адресам, и правильно выдает ссылки к таким данным.
Если вы пишите программы на Си, то в Вашем исходном тексте коды и данные могут быть перемешены, простой пример:
printf("Hello world");
Компилятор генерирует вызов функции с аргументом в виде строки. Куда ее деть? Проще всего переключиться на сегмент строк, разместить там соответствующую строку, а затем переключиться на сегмент кода и сгенерировать вызов:


RSEG STRINGS
??_str1:
DB 'Hello world', 0

RSEG CODE
LDI R16, LOW(??_str1)
LDI R17, HIGH(??_str1)
RCALL printf
....


Ну и т.д.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru