Чтобы ответить на ваши вопросы, обратите внимание, что это субъективно, поскольку существуют разные процессоры, разные платформы, разные ассемблеры и компиляторы Си, в этом случае я расскажу о платформе Intel x86.
- Ассемблеры не компилируются в чистый двоичный файл, они представляют собой необработанный машинный код, определенный сегментами, такими как данные, текст и bss, но это называется объектным кодом. Линкер вступает и настраивает сегменты, чтобы сделать его исполняемым, то есть готовым к работе. Кстати, вывод по умолчанию при компиляции с использованием gcc - это «a.out», что является сокращением для вывода Ассемблера.
- Загрузчики имеют специальную директиву, определенную еще во времена DOS, было бы общепринятым найти директиву, такую как
.Org 100h
, которая определяет код ассемблера как старый .COM, прежде чем .EXE вступит во владение по популярности. Кроме того, вам не нужно было иметь ассемблер для создания файла .COM, используя старый файл debug.exe, поставляемый с MSDOS, который выполнял небольшие простые программы, файлы .COM не нуждались в компоновщике и были прямо готовы. запустить двоичный формат. Вот простой сеанс с использованием DEBUG.
1:*a 0100
2:* mov AH,07
3:* int 21
4:* cmp AL,00
5:* jnz 010c
6:* mov AH,07
7:* int 21
8:* mov AH,4C
9:* int 21
10:*
11:*r CX
12:*10
13:*n respond.com
14:*w
15:*q
В результате получается готовая к запуску программа .COM с именем 'response.com', которая ожидает нажатия клавиши и не отображает его на экране. Обратите внимание, в начале используется значение «100h», которое показывает, что указатель «Инструкция» начинается с 100h, что является особенностью .COM. Этот старый скрипт в основном использовался в пакетных файлах, ожидая ответа, а не отражая его. Оригинальный скрипт можно найти здесь .
Опять же, в случае с загрузчиками, они конвертируются в двоичный формат, была программа, которая раньше шла с DOS, называемая EXE2BIN . Это была задача преобразования необработанного объектного кода в формат, который можно скопировать на загрузочный диск для загрузки. Помните, что компоновщик не запускает компоновщик, так как компоновщик предназначен для среды выполнения и устанавливает код, чтобы сделать его исполняемым и исполняемым.
BIOS при загрузке ожидает, что код будет в сегменте: смещение, 0x7c00, если моя память мне верна, код (после EXE2BIN'd) начнет выполняться, затем загрузчик переместится ниже в памяти и продолжить загрузку, введя int 0x13 для чтения с диска, включите шлюз A20, включите DMA, переключитесь в защищенный режим, так как BIOS находится в 16-битном режиме, затем данные, считанные с диска, загружаются в память, затем выдается загрузчик далеко прыгнуть в код данных (вероятно, будет написано в C). По сути, это то, как система загружается.
Хорошо, предыдущий абзац звучит отвлеченно и просто, возможно, я что-то упустил, но это в двух словах.
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.