x64-roadmap
                                
                                
                                
                                    x64-roadmap copied to clipboard
                            
                            
                            
                        A roadmap to learn x64 assembly using nasm on Linux.
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.
Roadmap
The Basics
- 
✓ 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)- 
✓ Register names and sizes (theory)
 - 
The
movinstruction - 
✓ Write a program that moves values between registers of different sizes (run)
 - 
The
xchginstruction 
 - 
 - 
✓ 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
- 
✓ Write a program with division operations (
idiv.asm) - 
✓ Write a program that does proper signed divisions with sign extensions (
sx.asm) 
 - 
 - 
Manipulating Strings
 - 
Floating point arithmetic
 - 
NASM local labels
 
Challenges
- 
Write a function that receives an integer and prints it
 - 
Write a function that receives an integer and returns a string with it