Hero roadmap: the whole course on one page
All 50 lessons
All 50 lessons live on the course index as a chapter tree. Each chapter below starts at its first lesson - open it and follow the chain to the end of the chapter:
Check yourself: first steps
Which two registers hold the syscall number and the first argument? (lesson 4, anatomy)
What does global _start do, and what does the linker do without it? (lesson 4, anatomy)
Write the shortest program that exits with status 0. (lesson 4, run)
Check yourself: core machine
Which register views exist for RAX, and what does MOV EAX do to the upper half? (lesson 5, widths)
Why is MOV [mem], [mem] illegal, and how do you work around it? (lesson 6, traps)
Which flags do CMP and TEST set, and why does MOV set none? (lesson 9, setters)
How does LEA rax, [rax+rax*2] multiply by 3 without touching memory? (lesson 14, trick)
Check yourself: memory and syscalls
Why does a .bss buffer cost nothing in the file? (lesson 15, bss)
How do you detect a failed syscall, and what range do error codes live in? (lesson 16, errors)
What is in RDX:RAX after a one-operand MUL? (lesson 17, muldiv)
What is the red zone, and why does Windows not have it? (lesson 38, redzone)
Check yourself: programmer's toolkit
How does a macro parameter reach the template, and what does ..@ fix? (lesson 21, local)
Which registers must a callee save, and which may it clobber freely? (lesson 38, saved)
How do you print a double from assembly? (lesson 29, print)
Check yourself: OS and network
What does the kernel push on the stack before _start runs? (lesson 27, stack)
Which syscalls make a listening TCP server, in order? (lesson 32, bind)
Why must a boot sector end in 0xAA55, and what sets the origin? (lesson 45, signature)
Check yourself: finish
Which capstone converted argv to numbers, and which read a file in chunks? (lessons 46 and 47)
Name one layout change that turns a memory-bound loop into a cache-friendly one. (lesson 48, cache)
Where to go next
Practice: rewrite each lesson's program from memory, then change one thing and predict the output before running it. The COBOL course on this site shows the other end of the spectrum - a language that maximizes explicitness - and the Ruby course shows how far a runtime can hide the machine.
Next steps for serious work: read the System V ABI document cover to cover, disassemble a small C program with objdump, and write a boot sector that boots in QEMU. After that, the art of assembly language (no Strock) and the Intel manuals are the deep references.
Next: Install NASM on Windows 11
Article author: Arthur Isaev