This is a roadmap for learning x86 assembly, using nasm on Linux. I will try to list the topics as I learn, sorting them from the most basic to most advanced, adding a series of small tasks and reference material for each topic.
As I complete each task/topic, a check mark (✓) will be added to the item
and a pointer to the solution will be provided. All solutions are inside
the tasks directory.
-
✓ Install the necessary tools (
installation/)-
✓ Install
nasm(nasm.md) -
✓ Install
ld,gcc,hexdump,objdump(most Linux distros already come with this installed)
-
-
✓ First program: the
exitsystem call (first_prog/)-
✓ Write, assemble and run a program that "does nothing", and check the return value (
build.md) -
✓ Try to exit with various exit codes (
exit8.asmandexit256.asm)
-
-
✓ Make a "hello world" program (
hello.asm) -
✓ Call assembly functions from C (
call_from_c)-
✓ Write an assembly program with a callable function that returns a 64-bit integer (
ret_int64.asm) -
✓ Write a small C program that calls this assembly function and displays the result in decimal, hexadecimal and binary formats (
caller.c) -
✓ Write a program with a function that returns a negative number (
ret_neg.asm)
-
-
Registers (
registers) -
✓ Look into machine code (
inspect_binary/howto.md)-
✓ Check out the machine code of a program with
hexdump -
✓ Disassemble a program with
objdump
-
-
✓ Basic Arithmetic (
arithmetic/run.md)-
✓ Make a program that sums two numbers (
add.asm) -
✓ Make a program that subtracts two numbers (
sub.asm) -
✓ Make a program that uses increment (
inc.asm) -
✓ Make a program that uses decrement (
dec.asm) -
✓ Make a program that uses unsigned integer multiplication (
mul.asm) -
✓ Make a program that uses signed integer multiplication (
imul.asm) -
✓ Make a program that obtains the negative of a number (
neg.asm)
-
-
✓ Labels and Unconditional Jumps (
jump)- ✓ Write a program with a
jmpinstruction (jump.asmandlabels.asm)
- ✓ Write a program with a
-
✓ Flags, Comparisons and Conditional Jumps (
flags/theory.md)-
✓ Write a program with a conditional jump (
cond_jump.asm) -
✓ Write a program with a loop (
loop.asm) -
✓ Write a program using the overflow flag (
overflow.asm) -
✓ Write a program contrasting the above and below comparisons with the greater than and less than comparisons (
above_below.asm)
-
-
Logical and Bitwise Operations (
logical)-
✓ Use AND and OR (
and_or.asm) -
✓ Use NOT and XOR (
not_xor.asm) -
✓ Shift and Rotate operations (
shift.asm)
-
-
✓ Data Types, Memory Addressing and the
.dataSection (data/run.md)-
✓ How memory works in Linux? (
theory.md) -
✓ Write a program that uses the
.datasection (print_data.asm) -
✓ Write a program that uses different data types (
types.asm) -
✓ Write a program that uses addressing with displacement (
ret4bytes.asm) -
✓ Write a program using addressing with a base register, an index register and scale factor (
ret_words.asm) -
✓ Write a program using the
.bsssection (bss.asm) -
✓ Write a program that uses a "global variable" from the
.bsssection (var_bss.asm) -
✓ Write a program that increments a "global variable" from the
.bsssection (inc_var.asm) -
✓ Write a program that manipulates an array (
array.asm)
-
-
✓ The Stack (
stack/theory.md)-
✓ Write a program that uses
pushandpop(push_pop.asm) -
✓ Write a program that uses the stack pointer to allocate space and access elements on the stack (
sp.asmandsp2.asm)
-
-
✓ The
callInstruction (call/theory.md)-
✓ Write a program that uses
call(call.asm) -
✓ Write a program that
calls aprintfunction/subroutine (print_func.asm)
-
-
Calling External Functions
-
✓ Write a program divided in two files using
extern/global(uselib.asmandlib.asm) -
✓ Write a program divided into two
.asmfiles using theincludemacro (includer.asmandinclude.asm) -
Write a library with a function containing arguments, and call it from another
asmfile -
Call a function from C
-
Write an assembly library function that takes arguments, and call it from C
-
Write an assembly program that calls a C function
-
✓ Write an assembly program that calls a C library function (
malloc.asm)
-
-
Using the Heap
- Use C's
mallocandfreeto allocate and free memory dynamically
- Use C's
-
Special
movinstructions-
Sign and Zero Extend
movand "size casting" directive -
Conditional
mov
-
-
✓ Arithmetic 2
-
Manipulating Strings
-
Floating point arithmetic
-
NASM local labels
-
Write a function that receives an integer and prints it
-
Write a function that receives an integer and returns a string with it