Acknowledgments
Foundational Texts
This book draws on a long tradition of assembly language education and systems programming literature. We are indebted to:
Kip Irvine, whose Assembly Language for x86 Processors has taught a generation of students and whose comprehensive coverage of the x86 instruction set informed our own. We disagree with the Windows/MASM focus and the price point, but the pedagogical depth is exemplary.
Randall Hyde, whose Art of Assembly Language demonstrated that assembly language can be taught accessibly and with wit. The HLA assembler was innovative; we chose NASM for practical reasons, but Hyde's approach to explanation influenced ours.
Jonathan Bartlett, whose Programming from the Ground Up showed that a free assembly language textbook could be excellent. It is dated now, but it pointed the way.
Randal Bryant and David O'Hallaron, whose Computer Systems: A Programmer's Perspective (CS:APP) is the gold standard for teaching the systems perspective to programmers. The framing of assembly as "the language between C and hardware" is theirs. If you finish this book, read CS:APP.
Agner Fog, whose optimization manuals and instruction latency/throughput tables are the definitive reference for anyone writing performance-sensitive assembly. These documents are free, exhaustive, and indispensable. Every performance chapter in this book is informed by his work.
Technical References
The Intel 64 and IA-32 Architectures Software Developer's Manuals are the authoritative source for x86-64 instruction encoding, semantics, and microarchitecture. Volume 2 (the instruction reference) lives permanently open in a browser tab when writing assembly code.
The AMD64 Architecture Programmer's Manual provides the AMD perspective, particularly useful for AMD-specific extensions.
The ARM Architecture Reference Manual (ARMv8-A) is the authoritative ARM64 reference. Dense but complete.
The System V AMD64 ABI specification (Matz, Hubicka, Jaeger, Mitchell) defines the calling conventions that every Chapter 11 and Chapter 20 discussion depends on.
The NASM Manual is a model of clear technical documentation. If something about NASM syntax is unclear, the manual is always the right answer.
Tools and Infrastructure
NASM (Netwide Assembler) — the assembler used throughout this book. Open source, cross-platform, Intel syntax, actively maintained.
GDB — the GNU Debugger. Used in every lab in the book. layout regs mode has saved more debugging sessions than we can count.
QEMU — the open-source machine emulator and virtualizer. Without QEMU, the bare-metal and OS chapters would require physical hardware. QEMU makes them accessible to everyone.
Ghidra — the NSA's open-source reverse engineering framework. Its existence as a free, professional-quality tool has fundamentally changed who can learn reverse engineering.
Compiler Explorer (godbolt.org) — Matt Godbolt's invaluable tool for exploring compiler output. Chapter 21 uses it extensively.
Community
The OSDev community (osdev.org and the OSDev wiki) has been answering "but how does the bootloader actually work?" questions for decades. The wiki is one of the best technical resources on the internet for low-level programming.
The assembly language and systems programming communities on Stack Overflow, Reddit, and various Discord servers have collectively answered every question about why the stack alignment requirement exists, how the PLT works, and what MOVZX is for.
The CTF community — particularly the pwn category — has pushed assembly and binary exploitation education further and faster than any academic setting. This book's security chapters are influenced by the quality of public CTF writeups.
To everyone who answered an assembly question on the internet: thank you.
To everyone who will find an error in this book and report it: thank you in advance.