Ассемблер создает объектные файлы в качестве вывода, как это делает компилятор.
Вы связываете их по той же самой причине - чтобы иметь возможность использовать библиотеки. Компоновщик также (как правило) знает о целевых форматах исполняемых файлов.
Тем не менее, существуют ассемблеры, которые производят исполняемые файлы напрямую, без участия компоновщика. Если память служит, NASM может создавать несколько исполняемых форматов напрямую, и некоторые старые ассемблеры для MS-DOS (например, A86) могут / работают так же.
Более простая установка и более быстрый цикл сборки делают их действительно удобными для начинающих, но требование поместить весь код в один модуль делает гораздо менее подходящим для больших проектов.