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
exit
system 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.asm
andexit256.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
jmp
instruction (jump.asm
andlabels.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
.data
Section (data/run.md
)-
✓ How memory works in Linux? (
theory.md
) -
✓ Write a program that uses the
.data
section (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
.bss
section (bss.asm
) -
✓ Write a program that uses a "global variable" from the
.bss
section (var_bss.asm
) -
✓ Write a program that increments a "global variable" from the
.bss
section (inc_var.asm
) -
✓ Write a program that manipulates an array (
array.asm
)
-
-
✓ The Stack (
stack/theory.md
)-
✓ Write a program that uses
push
andpop
(push_pop.asm
) -
✓ Write a program that uses the stack pointer to allocate space and access elements on the stack (
sp.asm
andsp2.asm
)
-
-
✓ The
call
Instruction (call/theory.md
)-
✓ Write a program that uses
call
(call.asm
) -
✓ Write a program that
call
s aprint
function/subroutine (print_func.asm
)
-
-
Calling External Functions
-
✓ Write a program divided in two files using
extern
/global
(uselib.asm
andlib.asm
) -
✓ Write a program divided into two
.asm
files using theinclude
macro (includer.asm
andinclude.asm
) -
Write a library with a function containing arguments, and call it from another
asm
file -
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
malloc
andfree
to allocate and free memory dynamically
- Use C's
-
Special
mov
instructions-
Sign and Zero Extend
mov
and "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