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