I remember at the time the book was in loose leaf paper so it warms my heart to see the book has a 3rd edition. It was used as a core part of teaching assembly, memory representations, and getting students ready for the operating systems class. When I help people learn to program, it's the only book I think is a must have:
https://www.amazon.com/Computer-Systems-Programmers-Perspect...
That said, others here have recommended C instead or in addition to Rust or Go; this makes sense to me.
C is actively used and remains the lingua franca of low/system level programs (for the time being.) I'd also say that its relatively simple syntax and closeness to the underlying representation have a lot going for it (at least what you'd imagine the underlying assembly representation to be - hardware and clever compilers are doing a lot.)
The C language is simple, more than either Rust or Go, and can be picked up quickly, in my view. But actually understanding and using it competently is an altogether different matter.
Additionally, an absolute wealth of books introducing OS, drivers, and system and network programming topics using C exist. Projects like Xv6, Minix, and even Linux provide for code bases to run through and explore
- Computer Systems: A Programmer's Perspective [0]
- The Linux Programming Interface [1]
- Advanced Programming in the UNIX Environment [2]
- Dive into Systems [3]
And the list goes on and on.
You'll likely never write production code or push production projects in C (one hopes), but it seems to me that it remains a very useful language to be able to work with and to understand.
[0] https://www.amazon.com/Computer-Systems-Programmers-Perspect...
[1] https://www.amazon.com/Linux-Programming-Interface-System-Ha...
[2] https://www.amazon.com/Programming-Environment-Addison-Wesle...
Or, any discrete math book because it will take me a lifetime to understand it.
If I choose an OS book, my life will be short indeed.
I rarely write or look at assembly language anymore because of three factors:
* Hardware is so fast that I don't need register level control of my code.
* Compilers are so good that I don't optimize the actual machine instruction use any better than the compilers produce.
* I'm now using Intel/AMD architecture machines almost exclusively. (But I am typing this on a M1 based system right now!) Our PC instruction sets have become more and more complex, full of features that may or may not be present on machines that are the intended target for execution. Programming at the assembly level is less tractable than it was in the past.
However, like vitamins, understanding assembly language is good for you, and many software developers will find assembly language useful as their careers develop. OS kernels, security and vulnerability work, high performance programming, device drivers, and the ubiquitous IOT all use into assembly language at least some of the time. These are generally not areas where new CS majors will be working professionally, but those with the goal of becoming a senior developer should learn assembly language.
I find that after a bit of practice with the instruction set, assembly language programming is fun because with only a (relatively) small set of atomic building blocks, the registers and the instructions, the programmer builds a solution. No scouring StackOverflow, no reading the latest Pragmatic Press book on a new framework, and no searching through packages and standard libraries for the proper use of some zipped iterators.
I have a few tips for autodidacts setting out to learn assembly language. First, take a look at the article. It's a very nice introduction to assembly language. Second, pick some simple projects. Don't sit down to write a chess program in ASM. Third, learn how to use a good debugger like GDB or DDD; being able to single step through your assembly language and seeing what is going on is essential.
My forth tip is the best. Read and do exercises from R. Bryant and D. O'Hallaron's book Computer Systems: A Programmer's Perspective 3rd Edition, see [1].This is on my short list of best books for CS students. Unfortunately, this book is $150 new, but you should be able to buy a good condition used copy from a university bookstore. I would never sell my own copy, it is just great. This book, and the required course for CS and ECS majors at CMU it was written for, is the inspiration for the notorious and wonderful Binary Bomb Lab exercise.
To be clear, R. Bryant and D. O'Hallaron is not a book about assembly language programming. It is a book about computer systems from the programmer's perspective and specifically from a C system programmers perspective. This requires a realistic understanding of assembly language. If there was just one book that I would like my hires to be familiar with it would be this book. The book covers so many important systems programming concepts that it is hard to summarize (unfortunately, I'm not at home with my copy) but some of the the subjects are bit representations, hardware architecture, assemblers, compilers and linkers, buffer overflow vulnerabilities, calling conventions, network programming, concurrency, shells (fork, signals, process control), the impact of hardware memory hierarchy on performance, and virtual memory implementations.
[1] https://www.amazon.com/Computer-Systems-Programmers-Perspect...?
While doing these labs: http://csapp.cs.cmu.edu/3e/labs.html
Also a colleague made me watch this from Jack Diederich: https://www.youtube.com/watch?v=o9pEzgHorH0
A Pattern Language, Alexander and Ishikawa and Silverstein http://amzn.to/2s9aSSc
Advanced Programming in the Unix Environment , Stevens http://amzn.to/2qPOMjN
Algorithmics: the Spirit of Computing, Harel http://amzn.to/2rW5FNS
Applied Crytography, Wiley http://amzn.to/2rsULxS
Clean Code, Martin http://amzn.to/2sIOWtQ
Clean Coder, Martin http://amzn.to/2rWgbEP
Code Complete, McConnel http://amzn.to/2qSUIwE
Code: The Hidden Language of Computer Hardware and Software, Petzold http://amzn.to/2rWfR9d
Coders at Work, Seibel http://amzn.to/2qPCasZ
Compilers: Principles, Techniques, & Tools, Aho http://amzn.to/2rCSUVA
Computer Systems: A Programmer's Perspective, O'Hallaron and Bryant http://amzn.to/2qPY5jH
Data Flow Analysis: Theory and Practice, Khedker http://amzn.to/2qTnSvr
Dependency Injection in .NET, Seemann http://amzn.to/2rCz0tV
Domain Driven Design, Evans http://amzn.to/2sIGM4N
Fundamentals of Wireless Communication, Tse and Viswanath http://amzn.to/2rCTmTM
Genetic Programming: An Intrduction, Banzhaf http://amzn.to/2s9sdut
Head First Design Patterns, O'Reilly http://amzn.to/2rCISUB
Implementing Domain-Driven Design, Vernon http://amzn.to/2qQ2G5u
Intrduction to Algorithms, CLRS http://amzn.to/2qXmSBU
Introduction to General Systems Thinking, Weinberg http://amzn.to/2qTuGJw
Joy of Clojure, Fogus and Houser http://amzn.to/2qPL4qr
Let over Lambda, Hoyte http://amzn.to/2rWljcp
Operating Systems: Design and Implementation, Tanenbaum http://amzn.to/2rKudsw
Parsing Techniques, Grune and Jacobs http://amzn.to/2rKNXfn
Peopleware: Productive Projects and Teams, DeMarco and Lister http://amzn.to/2qTu86F
Programming Pearls, Bentley http://amzn.to/2sIRPe9
Software Process Design: Out of the Tar Pit, McGraw-Hill http://amzn.to/2rVX0v0
Software Runaways, Glass http://amzn.to/2qT2mHn
Sorting and Searching, Knuth http://amzn.to/2qQ4NWQ
Structure and Interpretation of Computer Programs, Abelson and Sussman http://amzn.to/2qTflsk
The Art of Unit Testing, Manning http://amzn.to/2rsERDu
The Art of Unix Programming, ESR http://amzn.to/2sIAXUZ
The Design of Design: Essays from a Computer Scientist, Brooks http://amzn.to/2rsPjev
The Effective Engineer, Lau http://amzn.to/2s9fY0X
The Elements of Style, Strunk and White http://amzn.to/2svB3Qz
The Healthy Programmer, Kutner http://amzn.to/2qQ2MtQ
The Linux Programming Interface, Kerrisk http://amzn.to/2rsF8Xi
The Mythical Man-Month, Brooks http://amzn.to/2rt0dAR
The Practice of Programming, Kernighan and Pike http://amzn.to/2qTje0C
The Pragmatic Programmer, Hunt and Thomas http://amzn.to/2s9dlvS
The Psychology of Computer Programming, Weinberg http://amzn.to/2rsPypy
Transaction Processing: Concepts and Techniques, Gray and Reuter http://amzn.to/
Types and Programming Languages, Pierce http://amzn.to/2qT2d6G
Understanding MySQL Internals, Pachev http://amzn.to/2svXuFo
Working Effectively with Legacy Code, Feathers http://amzn.to/2sIr09R
Zen of graphics programming, Abrash http://amzn.to/2rKIW6Q
--Computer Organization--:
Computer Systems: A Programmer's Perspective http://www.amazon.com/Computer-Systems-Programmers-Randal-Br...
I liked this much better than Computer Organization and Design by Patterson and Hennessy which everyone has encountered at some point. The developer-centric view was very cool.
--Computer Security--:
Kernel Exploitation: Attacking the Core http://www.amazon.com/Guide-Kernel-Exploitation-Attacking-Co...
Most 'hacking' books are goofy. This one is very good and doubles nicely as a hackers operating systems text.
Web Application Hackers Handbook http://www.amazon.com/Web-Application-Hackers-Handbook-Disco...
Very nice overview for web concerns.
--Operating Systems-:
Operating System Design and Implementation http://www.amazon.com/Operating-Systems-Design-Implementatio...
I don't agree with Tanenbaum's views on micro vs. monolithic kernels but this book is a great mix of theory and implementation.
Linux Kernel Devleopment http://www.amazon.com/Linux-Kernel-Development-Robert-Love/d...
I used this to get a feel for the monolithic implementations of topics covered by Tanenbaum.
--Networking--:
TCP/IP Illustrated Series. More than you would ever want to know.
[1] http://www.amazon.com/Computer-Systems-Programmers-Randal-Br...
[2] http://www.amazon.com/Design-Operating-System-Prentice-Softw...
[1] - https://www.amazon.com/Computer-Systems-Programmers-Perspect...