1. Нужно текстовое представление машинного кода, чтобы с ним можно было удобно работать, а не править битики в hexdump-ах.
2. Если вам надо писать прям очень оптимизированный код, вы будете делать это на intrinsic-конструкциях в Си или Си++, но это почти тот же ассемблер с щепоткой синтаксического сахара.
3. Хоть и считается, что у Си или Rust нет никакого runtime, но он там есть, как минимум, нужно настроить стеки, вектора прерываний и всякое такое прочее, машинно зависимое. И это придётся писать на ассемблере.
4. В компиляторах и процессорах бывают баги. И чтобы понять, в чём они заключаются, нужно текстовое представление машинного кода.
Как минимум, для всего этого ассемблер нужен.