Это довольно сложно, и обычно включает в себя два шага:
- Ассемблер считывает ассемблерный код, вычисляет соответствующий машинный код и записывает его в объектный файл вместе с другой информацией, которая варьируется в зависимости от формата объектного файла, который вы используете
- Компоновщик берет набор объектных файлов и объединяет их в исполняемый файл, который действительно может быть запущен
Таким образом, ассемблер обычно не выводит исполняемые файлы; вам нужно выбрать формат объектного файла и прочитать о том, как его сгенерировать. Теоретически, до тех пор, пока вы выводите действительный объектный файл в заданном формате, любой компоновщик должен иметь возможность выполнять фактический процесс компоновки, но обычно ассемблеры и компоновщики поставляются в виде набора, поэтому я не уверен, насколько хорошо он будет на самом деле практическая работа (например, GNU-ассемблер (газ) выводит специфичные для GNU перемещения и секции, которые компоновщик GNU (ld) знает, как обрабатывать, поэтому вы не можете использовать генерируемые газом объектные файлы в любом другом компоновщике)
ELF описан в разделе 4 SV ABI , хотя вам также необходимо прочитать приложение к вашему процессору. COFF задокументирован как часть спецификации PE, хотя я нигде не могу найти его в Интернете; если вам это нужно, я могу выложить куда-нибудь