Разделы - это не более чем независимые последовательности памяти. Каждый новый байт данных помещается в текущий открытый «программный раздел». При написании функции очень удобно иметь связанные данные в исходном коде достаточно близко, хотя при загрузке в память они могут находиться на расстоянии в несколько мегабайт или гигабайт.
Пользовательские программные разделы работают так же, как и стандартные разделы, хотя обычно вам придется предоставлять дополнительную информацию компоновщику и другим инструментам постобработки кода, чтобы они разумным образом загружались в память.
Вы можете поместить исполняемый код в раздел данных и наоборот, и большинство ассемблеров даже не предупредит об этом. Выполнение кода из раздела данных может потребовать небольшой хитрости; обратное обычно легко.
Ассемблеры обрабатывают секции, как правило, записывая эквивалент в объектный модуль в том же порядке, что и исходный код, оставляя перестановку похожих секций вместе с компоновщиком. Только самые простые сборщики не предоставляют такую возможность. На ум приходит оригинальный файл MSDOS .COM
.
Разные ассемблеры придерживаются разных взглядов на программирование. Традиционная тактика заключается в предположении, что программист на ассемблере знает, что он делает, и делает буквально то, что написано, за исключением того, что не понято. Другие ассемблеры являются более полезными (или боль в заднице, в зависимости от вашей точки зрения) и жалуются на смещенные многобайтовые структуры, несоответствия типов данных или кода и т. Д., И т. Д.
Исходя из «полезности» ассемблера, неспособность инициировать программный раздел приводит к поведению по умолчанию (обычно предполагаемому коду .psect) или отказу в сборке с фатальной ошибкой. Даже самому структурированному ассемблеру все равно, нет ли текста, данных или bss. На самом деле, существуют полезные объектные модули, состоящие только из определения символа без каких-либо байтов данных (или кода).