Я дізнався з книги Кіпа Ірвіна . Якщо ви проігноруєте (справедливу) критику його (нерелевантних) бібліотек, я можу рекомендувати це як гарне введення до самої мови - хоча для справді цікавих речей вам доведеться полювати на нав'язливих в мережі.
Я думаю, що корисно зрозуміти, що відбувається на нижчих рівнях. Досліджуючи асемблер, ви дізнаєтесь про конвеєрний процесор, прогнозування гілок, вирівнювання кешу, SIMD, порядок вказівок тощо. Їх знання допоможе вам написати кращий код високого рівня.
Крім того, загальноприйнята мудрість полягає в тому, щоб не намагатися оптимізувати збірку більшу частину часу, але нехай компілятор турбується про це. Коли ви побачите кілька прикладів викривлених речей, які створюють компілятори, ви краще зрозумієте, чому дотримується загальноприйнята мудрість.
Приклад: LFSR швидко працюють з інструкцією обертання з перенесенням, для таких конкретних випадків так само просто написати версію асемблера, як і виявити, чи достатньо розумний компілятор, щоб це зрозуміти. Іноді ви просто знаєте щось , чого компілятор не знає.
Це також покращує ваше розуміння проблем безпеки - напишіть або виконайте, перевиконання стека тощо.
Деякі проблеми паралельності стають очевидними лише тоді, коли ви усвідомлюєте, що відбувається на рівні кожної інструкції.
Іноді це може бути корисно при налагодженні, якщо у вас немає повного вихідного коду.
Там цінність. Як взагалі реалізуються віртуальні функції? Ви коли-небудь пробували писати програми DirectX або COM на асемблері? Як повертаються великі структури, чи пропонує функція виклику місце для них чи навпаки?
Потім існують спеціальні мови збірки для графічного обладнання, хоча мови шейдерів кілька років тому вийшли на високий рівень, все, що дозволяє думати про проблему по-іншому, добре.