나는 Kip Irvine의 책 에서 배웠습니다 . 그의 (부적절한) 도서관에 대한 (공정한) 비판을 무시한다면, 나는 그것을 언어 자체에 대한 좋은 소개로 추천 할 수 있습니다. 정말 흥미로운 것들에 대해서는 인터넷에서 강박 관념을 찾아 내야합니다.
낮은 수준에서 일어나는 일을 이해하는 것이 유용하다고 생각합니다. 어셈블러를 연구하면서 CPU 파이프 라이닝, 분기 예측, 캐시 정렬, SIMD, 명령어 재정렬 등에 대해 배우게됩니다. 이에 대한 지식은 더 나은 고수준 코드를 작성하는 데 도움이됩니다.
게다가, 관습적인 통념은 대부분의 시간에 어셈블리를 직접 최적화하려고하지 않고 컴파일러가 그것에 대해 걱정하게하는 것입니다. 컴파일러가 생성하는 뒤틀린 것들의 몇 가지 예를 보면 왜 관습적인 통념이 유지되는지 더 잘 이해할 것입니다.
예 : LFSR은 rotate-with-carry 명령어를 사용하여 빠르게 실행됩니다. 이와 같은 특정 경우에는 컴파일러가 알아낼만큼 똑똑한 지 여부를 알아내는 것만 큼 어셈블러 버전을 작성하는 것이 쉽습니다. 때로는 컴파일러가 모르는 것을 알고 있습니다.
또한 쓰기 또는 실행, 스택 오버런 등과 같은 보안 문제에 대한 이해도를 높입니다.
약간 동시성 문제는 명령어 별 수준에서 무슨 일이 일어나고 있는지 알고있을 때만 분명해집니다.
완전한 소스 코드가없는 경우 디버깅 할 때 유용 할 수 있습니다.
호기심 가치가 있습니다. 어쨌든 가상 기능은 어떻게 구현됩니까? 어셈블러에서 DirectX 또는 COM 프로그램을 작성해 본 적이 있습니까? 큰 구조는 어떻게 반환됩니까? 호출 함수가 공간을 제공합니까? 아니면 그 반대의 경우도 마찬가지입니까?
그리고 그래픽 하드웨어를위한 특별한 어셈블리 언어가 있습니다. 비록 셰이더 언어가 몇 년 전에 고급 수준 이었지만 문제를 다른 방식으로 생각할 수있는 모든 것이 좋습니다.