Assembly Language

A computer’s processor executes machine code: numbers that encode instructions like add, load, store, and jump. Writing those numbers by hand is tedious and unforgiving. Assembly language replaces them with short text mnemonics, such as ADD or JMP, and lets the programmer use names for memory locations instead of raw addresses. A program called an assembler translates this notation into the binary the processor actually runs.

The mapping is close to one-to-one: each assembly instruction usually corresponds to a single machine instruction for a specific processor. This makes assembly the layer just above raw binary, and it ties the language tightly to a particular CPU. Code written for one processor’s instruction set generally will not run on another, which is exactly the portability problem that later high-level languages set out to solve.

The foundational text is Wilkes, Wheeler, and Gill’s 1951 book “The Preparation of Programs for an Electronic Digital Computer,” written for the EDSAC machine at Cambridge and widely regarded as the first book on computer programming. It introduced practical techniques for writing programs in symbolic form and assembling them, along with the influential idea of a library of reusable subroutines. The scanned original is available through the Internet Archive.

Assembly remained the primary way to write software for years, and it never fully disappeared. Operating-system kernels, device drivers, and performance-critical routines still drop into assembly when they must control the hardware precisely. But the labor of writing it directly is much of what motivated the move to compilers and languages like BCPL, B, and C, which let programmers express ideas once and have a tool generate the machine code.

Sources

Last verified June 7, 2026