Ассемблер это язык прямой подмены текст - инструкция, он почти не зависит от компилятора, но зависит от железной архитектуры, под которую пишете (даже разные поколения ядер одного и того же производителя могут иметь разные команды, точнее для совместимости снизу вверх добавляются новые но старые редко удаляются).
Помимо языка в ассемблере есть еще препроцессор, некий псевдоязык, которым обрабатываются файлы исходники проекта для получения ассемблерных текстов, зачастую это простые подстановочные дефайны с аргументами и поддержкой условий, но не обязательно, вот тут уже вопрос, какую его реализацию предлагают какие компиляторы.
Писать весь проект на чистом ассемблере это абсолютно бесполезное занятие, может ради растопырки пальцев только что, какие то конкурсы проводятся по минимизации бинарников и прочего. Зачастую пишут ассемблерные вставки - критичные для скорости участки кода, либо когда компилятор не способен делать необходимые низкоуровневые вещи (доступ к определенным инструкциям процессора например). Знание ассемблера актуально для чтения дампов своего кода и реверсинженеринга чужого кода, для исследования или поиска багов.
драйвера, вирусы еще больше хочу понимать как все устроено. Может ос напишу, если смогу
для этого не нужен ассемблер
Сейчас низкоуровневым программированием считается язык си C (тот что без плюсов) на нем и пишут и ос и драйвера (кстати тоже не обязательно, и c++ подойдет и pascal, вон rust пиарят во всю для этого), а вирусы вообще пишут на всем что угодно, хоть на visual basic script в офисном документе.