разделы в программе на ассемблере - PullRequest
5 голосов
/ 21 марта 2012

Я не совсем понимаю, как разделы (объявленные с использованием директивы section) в программе сборки обрабатываются ассемблером и компоновщиком. Ниже приведены некоторые из запросов:

  • Какая польза от пользовательских разделов (разделов, отличных от стандартных .text, .data, .bss)?

  • Что если я помещу код в раздел данных, а данные - в раздел кода? Как ассемблер справляется с этим?

  • Если в программе не объявлено ни одного раздела, что будет делать ассемблер?

  • Если объявлены только определенные пользователем разделы (без текста, данных и bss), что будет делать ассемблер?

Я знаю, что могу написать программы на ассемблере, чтобы проверить, будет ли программа работать в каждом случае, но я хочу прояснить концепцию.

1 Ответ

2 голосов
/ 21 марта 2012

Разделы - это не более чем независимые последовательности памяти. Каждый новый байт данных помещается в текущий открытый «программный раздел». При написании функции очень удобно иметь связанные данные в исходном коде достаточно близко, хотя при загрузке в память они могут находиться на расстоянии в несколько мегабайт или гигабайт.

Пользовательские программные разделы работают так же, как и стандартные разделы, хотя обычно вам придется предоставлять дополнительную информацию компоновщику и другим инструментам постобработки кода, чтобы они разумным образом загружались в память.

Вы можете поместить исполняемый код в раздел данных и наоборот, и большинство ассемблеров даже не предупредит об этом. Выполнение кода из раздела данных может потребовать небольшой хитрости; обратное обычно легко.

Ассемблеры обрабатывают секции, как правило, записывая эквивалент в объектный модуль в том же порядке, что и исходный код, оставляя перестановку похожих секций вместе с компоновщиком. Только самые простые сборщики не предоставляют такую ​​возможность. На ум приходит оригинальный файл MSDOS .COM.

Разные ассемблеры придерживаются разных взглядов на программирование. Традиционная тактика заключается в предположении, что программист на ассемблере знает, что он делает, и делает буквально то, что написано, за исключением того, что не понято. Другие ассемблеры являются более полезными (или боль в заднице, в зависимости от вашей точки зрения) и жалуются на смещенные многобайтовые структуры, несоответствия типов данных или кода и т. Д., И т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...