Ассемблер нужен не только для того, чтобы писать для него прикладные программы. Это как раз-таки глубоко вторично, причём крэкинг/реверс/вирусология и прочие области применения, которые в настоящий исторический момент упоминают как ассемблерные, в данном ракурсе являются вторичным тоже. Машинные коды и ассемблерные мнемоники лежат в основе всего ПО, даже если оно написано на высокоуровневом языке (или напрограммировано мышкой).
В Linux компилятор GCC выполняет вовсе не преобразование кода на Си или Си++ в машинные коды - он преобразует высокоуровневый код в код на языке ассемблера. А потом вызывает GAS (Gnu assembler) который уже перегоняет его в машинные коды (если быть точным, то в объектный файл; затем тот же GCC вызывает редактор связей, который делает из объектного файла исполняемый). Внимание, вопрос: если мы не знаем ни машинных кодов команд, ни их ассемблерных мнемоник - как нам написать компилятор? Никак. А без компилятора - как преобразовать программу в исполняемый файл? (Компилятор можно заменить на интерпретатор, это не принципиально).
Поскольку ОС - тоже компилируемая программа, то замечание выше о компиляторах работает и для них. Но есть ещё один момент. Некоторые куски кода ОС можно написать только на ассемблере - например, обработчики прерываний. На Си такого не напишешь, нужно выполнять определённые манипуляции с регистрами. Как это сделать, если производитель скрыл операции процессора? Ответ: тоже никак.
Я, возможно, чего-то не понимаю, прошу тогда пояснить на конкретных примерах, где и что "производители скрывают".
Про "отдельный компьютер под отдельную задачу" - это, прости, бред. Ты предлагаешь браузер смотреть на одном компьютере (пусть даже под компьютером понимать одно процессорное ядро с особой, заточенной под работу браузера архитектурой), почту проверять на другом, в танчики играть - на третьем? Это будет ад для разработчиков процессоров, ад для разработчиков программ, да и пользователям тоже радости не принесёт.