Я узнал из книги Кипа Ирвина . Если вы игнорируете (справедливую) критику его (нерелевантных) библиотек, я могу порекомендовать это как хорошее введение в сам язык - хотя для действительно интересных вещей вам нужно выслеживать одержимых в сети.
Думаю, полезно понять, что происходит на нижних уровнях. Изучая ассемблер, вы узнаете о конвейерной обработке процессора, прогнозировании ветвлений, выравнивании кеша, SIMD, переупорядочении инструкций и так далее. Знание этого поможет вам лучше писать высокоуровневый код.
Более того, принято считать, что большую часть времени не следует пытаться оптимизировать сборку вручную, а позволить компилятору позаботиться об этом. Когда вы увидите несколько примеров извращенных вещей, которые генерируют компиляторы, вы лучше поймете, почему общепринятая мудрость верна.
Пример: LFSR работают быстро с помощью инструкции поворота с переносом, для конкретных случаев, подобных этому, так же легко написать версию на ассемблере, как и определить, достаточно ли умен компилятор, чтобы понять это. Иногда вы просто знаете то , чего не знает компилятор.
Это также помогает лучше понять проблемы безопасности - запись или выполнение, переполнение стека и т. Д.
Некоторые проблемы параллелизма становятся очевидными только тогда, когда вы знаете, что происходит на уровне каждой инструкции.
Иногда это может быть полезно при отладке, если у вас нет полного исходного кода.
Это ценность любопытства. Как вообще реализуются виртуальные функции? Вы когда-нибудь пробовали писать программы DirectX или COM на ассемблере? Как возвращаются большие структуры, предлагает ли вызывающая функция место для них или наоборот?
Кроме того, существуют специальные языки ассемблера для графического оборудования, хотя языки шейдеров вышли на высокий уровень несколько лет назад, все, что позволяет вам думать о проблеме по-другому, хорошо.