Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yds12/x64-roadmap
A roadmap to learn x64 assembly using nasm on Linux.
https://github.com/yds12/x64-roadmap
assembly assembly-language assembly-x86-64 guide linux nasm nasm-assembly tutorial
Last synced: about 1 month ago
JSON representation
A roadmap to learn x64 assembly using nasm on Linux.
- Host: GitHub
- URL: https://github.com/yds12/x64-roadmap
- Owner: yds12
- License: mit
- Created: 2020-05-14T09:52:42.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-07-16T15:54:20.000Z (over 4 years ago)
- Last Synced: 2024-02-17T06:33:05.545Z (9 months ago)
- Topics: assembly, assembly-language, assembly-x86-64, guide, linux, nasm, nasm-assembly, tutorial
- Language: Assembly
- Homepage:
- Size: 659 KB
- Stars: 73
- Watchers: 1
- Forks: 9
- Open Issues: 1
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
This is a roadmap for learning x86 assembly, using
[nasm](https://www.nasm.us/) 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/`](tasks/installation))
* ✓ Install `nasm` ([`nasm.md`](tasks/installation/nasm.md))
* ✓ Install `ld`, `gcc`, `hexdump`, `objdump` (most Linux distros
already come with this installed)* ✓ First program: the `exit` system call ([`first_prog/`](tasks/first_prog))
* ✓ Write, assemble and run a program that "does nothing", and check
the return value ([`build.md`](tasks/first_prog/build.md))* ✓ Try to exit with various exit codes
([`exit8.asm`](tasks/first_prog/exit8.asm) and
[`exit256.asm`](tasks/first_prog/exit256.asm))* ✓ Make a "hello world" program ([`hello.asm`](tasks/helloworld/hello.asm))
* ✓ Call assembly functions from C ([`call_from_c`](tasks/call_from_c/run.md))
* ✓ Write an assembly program with a callable function that returns a
64-bit integer ([`ret_int64.asm`](tasks/call_from_c/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`](tasks/call_from_c/caller.c))* ✓ Write a program with a function that returns a negative number
([`ret_neg.asm`](tasks/call_from_c/ret_neg.asm))* Registers ([`registers`](tasks/registers))
* ✓ Register names and sizes ([theory](tasks/registers/theory.md))
* The `mov` instruction
* ✓ Write a program that moves values between registers of different sizes
([run](tasks/registers/run.md))* The `xchg` instruction
* ✓ Look into machine code
([`inspect_binary/howto.md`](tasks/inspect_binary/howto.md))* ✓ Check out the machine code of a program with `hexdump`
* ✓ Disassemble a program with `objdump`
* ✓ Basic Arithmetic ([`arithmetic/run.md`](tasks/arithmetic/run.md))
* ✓ Make a program that sums two numbers
([`add.asm`](tasks/arithmetic/add.asm))* ✓ Make a program that subtracts two numbers
([`sub.asm`](tasks/arithmetic/sub.asm))
* ✓ Make a program that uses increment
([`inc.asm`](tasks/arithmetic/inc.asm))* ✓ Make a program that uses decrement
([`dec.asm`](tasks/arithmetic/dec.asm))* ✓ Make a program that uses unsigned integer multiplication
([`mul.asm`](tasks/arithmetic/mul.asm))
* ✓ Make a program that uses signed integer multiplication
([`imul.asm`](tasks/arithmetic/imul.asm))* ✓ Make a program that obtains the negative of a number
([`neg.asm`](tasks/arithmetic/neg.asm))* ✓ Labels and Unconditional Jumps ([`jump`](tasks/jump))
* ✓ Write a program with a `jmp` instruction
([`jump.asm`](tasks/jump/jump.asm) and [`labels.asm`](tasks/jump/labels.asm))* ✓ Flags, Comparisons and Conditional Jumps
([`flags/theory.md`](tasks/flags/theory.md))* ✓ Write a program with a conditional jump
([`cond_jump.asm`](tasks/flags/cond_jump.asm))* ✓ Write a program with a loop ([`loop.asm`](tasks/flags/loop.asm))
* ✓ Write a program using the overflow flag
([`overflow.asm`](tasks/flags/overflow.asm))* ✓ Write a program contrasting the above and below comparisons with the
greater than and less than comparisons
([`above_below.asm`](tasks/flags/above_below.asm))* Logical and Bitwise Operations ([`logical`](tasks/logical))
* ✓ Use AND and OR ([`and_or.asm`](tasks/logical/and_or.asm))
* ✓ Use NOT and XOR ([`not_xor.asm`](tasks/logical/not_xor.asm))* ✓ Shift and Rotate operations ([`shift.asm`](tasks/logical/shift.asm))
* ✓ Data Types, Memory Addressing and the `.data` Section
([`data/run.md`](tasks/data/run.md))* ✓ How memory works in Linux?
([`theory.md`](tasks/data/theory.md))* ✓ Write a program that uses the `.data` section
([`print_data.asm`](tasks/data/print_data.asm))
* ✓ Write a program that uses different data types
([`types.asm`](tasks/data/types.asm))* ✓ Write a program that uses addressing with displacement
([`ret4bytes.asm`](tasks/data/ret4bytes.asm))* ✓ Write a program using addressing with a base register,
an index register and scale factor
([`ret_words.asm`](tasks/data/ret_words.asm))* ✓ Write a program using the `.bss` section
([`bss.asm`](tasks/data/bss.asm))* ✓ Write a program that uses a "global variable" from the `.bss` section
([`var_bss.asm`](tasks/data/var_bss.asm))* ✓ Write a program that increments a "global variable" from the
`.bss` section ([`inc_var.asm`](tasks/data/inc_var.asm))* ✓ Write a program that manipulates an array
([`array.asm`](tasks/data/array.asm))* ✓ The Stack ([`stack/theory.md`](tasks/stack/theory.md))
* ✓ Write a program that uses `push` and `pop`
([`push_pop.asm`](tasks/stack/push_pop.asm))* ✓ Write a program that uses the stack pointer to allocate space and
access elements on the stack ([`sp.asm`](tasks/stack/sp.asm) and
[`sp2.asm`](tasks/stack/sp2.asm))* ✓ The `call` Instruction ([`call/theory.md`](tasks/call/theory.md))
* ✓ Write a program that uses `call` ([`call.asm`](tasks/call/call.asm))
* ✓ Write a program that `call`s a `print` function/subroutine
([`print_func.asm`](tasks/call/print_func.asm))* Calling External Functions
* ✓ Write a program divided in two files using `extern`/`global`
([`uselib.asm`](tasks/extern/uselib.asm) and
[`lib.asm`](tasks/extern/lib.asm))* ✓ Write a program divided into two `.asm` files using the `include` macro
([`includer.asm`](tasks/extern/includer.asm) and
[`include.asm`](tasks/extern/include.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`](tasks/extern/malloc.asm))* Using the Heap
* Use C's `malloc` and `free` to allocate and free memory dynamically
* Special `mov` instructions
* Sign and Zero Extend `mov` and "size casting" directive
* Conditional `mov`
* ✓ Arithmetic 2
* ✓ Write a program with division operations
([`idiv.asm`](tasks/arith2/idiv.asm))
* ✓ Write a program that does proper signed divisions with sign extensions
([`sx.asm`](tasks/arith2/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