|
А распределение данных по сегментам делает или компилятор или программист.
А сегментация программы как раз и обуславливается тем, что данные с разным назначением удобнее располагать в разных сегментах. При этом одни данные должны располагаться по фиксированным адресам (например, вектора прерываний) и они размещаются в соотвтствующем сегменте. Другие могут быть размещены произвольно и компилятор (или программист) размещает их в перемещаемые сегменты. Линкер на этапе сборки программы размещает их по физическим адресам, и правильно выдает ссылки к таким данным.
Если вы пишите программы на Си, то в Вашем исходном тексте коды и данные могут быть перемешены, простой пример:
printf("Hello world");
Компилятор генерирует вызов функции с аргументом в виде строки. Куда ее деть? Проще всего переключиться на сегмент строк, разместить там соответствующую строку, а затем переключиться на сегмент кода и сгенерировать вызов:
RSEG STRINGS
??_str1:
DB 'Hello world', 0RSEG CODE
LDI R16, LOW(??_str1)
LDI R17, HIGH(??_str1)
RCALL printf
....
E-mail: info@telesys.ru