These notes are focused on assembly language and related tooling (linkers, loaders, etc).
Speficially, those used on the following machines:
- Modern personal computers (MS Windows, Linux, or Mac)
- Video Game Consoles (fourth gen and up)
These are in alphabetical order by author.
Demystifying programs that create programs
- Part 1: A disassembler
- Part 2: Starting an assembler
- Part 3: Globals, passes, and error handling
- Part 4: Parsing
- Part 5: Processing our first opcode
- Part 6: Processing more opcodes
- Part 7: Further opcode processing
- Part 8: Finishing opcode processing
- Source
Assembly Programming and Computer Architecture for Software Engineers
Performance-Aware Programming Series
- Part 1: Reading ASM
- Instruction Decoding on the 8086
- Decoding Multiple Instructions and Suffixes
- Opcode Patterns in 8086 Arithmetic
- 8086 Decoder Code Review
- Using the Reference Decoder as a Shared Library
- Simulating Non-memory MOVs
- Simulating ADD, SUB, and CMP
- Simulating Conditional Jumps
- Simulating Memory
- Simulating Real Programs
- Other Common Instructions
- The Stack
- From 8086 to x64
- 8086 Simulation Code Review
An Introduction to Assembly Programming with RISC-V
https://www.johnlevine.com/index.phtml
Beginning x64 Assembly Programming: From Novice to AVX Professional
- Part 0 - Setup and First Steps
- Part 1 - Metaprogramming in Flat Assembler
- Part 2 - We're Writing a Virtual Machine
- Part 3 - Arithmetic and Logic
Demystifying Debuggers, Part 2: The Anatomy Of A Running Program
Goes over OS exectuable format, loaders.
Order by interest. My preference was on simple tools written in a C-like, data-oriented, or procedural way. I don't want to deal with low level tooling marred by dense language abstractions.
YASM (Rewrite (on some) of Netwide in C)
Assemblers below are just noted to exist but I don't care for.
SBCL: the ultimate assembly code breadboard
CppCon 2018: Matt Godbolt “The Bits Between the Bits: How We Get to main()”