CodeWithBotina
Jun 11, 2026 17 min read

Assembly: the language that never left, only changed its trench

Assembly: the language that never left, only changed its trench

Assembly: the language that never left, only changed its trench

Almost everything you do with a computer ends up, inevitably, in machine code. The most sophisticated compiler, the most elegant interpreter, the most popular framework: they are all layers of abstraction that rest on a foundation of binary instructions. And just above that sea of ones and zeros is Assembly, the language closest to the hardware that is still used by humans.

In the popular imagination, Assembly is that cryptic language from the 1970s, written by programmers in white coats with bushy beards, which today only survives in computer museums. The reality is much more interesting. Assembly is not only alive in 2026, but is experiencing a quiet renaissance. Artificial intelligence is rediscovering it as the ideal testing ground for ultra‑precise optimization. ARM and RISC‑V architectures have put it back at the center of the embedded systems debate. And the banking mainframes that move trillions of dollars a day are still running Assembly code written more than 30 years ago.

This article is a deep dive into Assembly: what it is, where it was born, why it became indispensable, how it is used today, and where it is headed. And at the end, a hint: what comes next is called WebAssembly, and it is the piece that connects this classic language with the future of the web.


What is Assembly?

Assembly is a low‑level programming language. That is the most common definition, but also the least informative. Low level means that each instruction in Assembly corresponds directly to an instruction that the CPU understands without intermediate translation. Whereas in Python or JavaScript a single line can execute hundreds of operations, in Assembly each line is an atomic operation: move a number to a register, add two values, jump to another memory address.

The fundamental difference from high‑level languages is that Assembly is not portable. A program written for an x86 architecture will not run on an ARM processor without being completely rewritten. This is because each CPU family has its own instruction set, its own syntax, and its own conventions. That specificity is both its greatest weakness and its greatest strength: it gives absolute control over the hardware, but at the cost of being tied to a specific platform.

To write in Assembly you use an assembler. This program translates the code written with human‑readable mnemonics (e.g., MOV, ADD, JMP) into the machine code that the CPU executes. In professional jargon, the word "assembler" is used to refer both to the language and to the program that translates it, which sometimes causes confusion.

flowchart LR
    A[Assembly code\nMOV AX, 5\nADD AX, 3] --> B[Assembler]
    B --> C[Machine code\n10111000 00000101\n00000101 11000011]
    C --> D[CPU]

The diagram shows the assembly process. The code written by the human goes through the assembler and becomes binary instructions that the CPU executes directly. There is no intermediate compilation, no virtual machine. That is why Assembly can be so fast, and also so dangerous: a mistake can corrupt memory or crash the whole system.


The origin: 1947 and the first mnemonics

The history of Assembly is the history of how humans stopped programming in binary and started using a more comprehensible language. The earliest evidence of an assembly language is found in the work of Kathleen Booth and Andrew Donald Booth in 1947, in the context of the ARC (Automatic Relay Computer). Kathleen Booth, a pioneering mathematician and programmer, documented what could be considered the first assembler code. Her goal was to create a symbolic representation for the ARC's machine code instructions.

The key breakthrough came with the EDSAC, the first fully operational stored‑program computer, built at Cambridge University in 1949. The EDSAC had a system called "initial orders", a set of bootstrap routines that already used single‑letter mnemonics to represent instructions. It was one of the first assemblers in the modern sense.

Nathaniel Rochester, an IBM engineer, wrote an assembler for the IBM 701, IBM's first scientific computer, in 1954. This assembler allowed programmers to use symbolic names for memory addresses and operations, drastically simplifying programming for that system.

The evolution continued with SOAP (Symbolic Optimal Assembly Program) in 1955, an assembler for the IBM 650 that included automatic optimizations. And in the 1960s came GAS (Generalized Assembly System) for the IBM 7090, developed by Douglas McIlroy (famous for his work on UNIX) and George Mealy, which already had a modern look with macros and data sections.

But if there are two names that deserve special recognition, they are Nathaniel Rochester and, above all, Kathleen Booth. While official history often forgets the pioneers, it was Kathleen Booth's work in 1947 that laid the conceptual foundations of symbolic assembly. Her legacy is a reminder that low‑level programming, far from being a male stronghold, had from the beginning brilliant women charting the path.

The original motivation was pure productivity. Programming directly in binary was so tedious and error‑prone that it became unsustainable for larger projects. Mnemonics and symbolic labels eliminated the need to calculate memory addresses manually and remember numeric operation codes. Every advance in assemblers was a step toward abstraction, which would later culminate in the first compilers for high‑level languages such as FORTRAN and COBOL. As an academic source from Sumy University explains, "Assembly eliminated much of the tedious and error‑prone programming of the first generation, freeing programmers from tasks such as remembering numeric codes and calculating addresses."


Popularity and heyday: the golden years

During the 1960s, 1970s, and 1980s, Assembly was the dominant language for any task that required performance or direct hardware control. Operating systems were written entirely in Assembly. The Burroughs MCP of 1961 was an exception, being written in a dialect of Algol, but the general rule was pure assembler.

The microcomputer ecosystem of the 1980s, such as the Commodore 64, Apple II, and ZX Spectrum, was dominated by assembler. Video games were programmed directly in Assembly to squeeze every clock cycle from the slow processors of the time. Demos, those small audiovisual artworks that pushed hardware limits, were the breeding ground for "coders" who knew the registers and interrupts of their machines by heart.

In the IBM mainframe world, the language was Assembler (with a capital A), and around it grew a culture of extremely efficient programming. Many of the banking transactions that take place today still pass through Assembly code written in the 1980s and 1990s.

However, from the 1990s onward, its use began to decline. The arrival of optimizing compilers for C, C++, and other high‑level languages made the performance gap between generated code and hand‑written code narrow dramatically. Moreover, the growing importance of software portability and maintainability led to a greater focus on high‑level languages that could be easily compiled across different platforms. Most systems development moved to C, relegating Assembly to very specific tasks.


Types of assemblers: a tower of Babel by architecture

Assembly is not a single language. Each CPU architecture has its own. This fragmentation is the defining characteristic of this type of programming.

The main types of assemblers by architecture include:

  • x86/x86-64: The dominant architecture on PCs and servers, used by Intel and AMD processors. Its assembler, with a complex CISC (Complex Instruction Set Computer) syntax, is essential in the development of operating systems like Windows and Linux.

  • ARM: The queen of mobile devices and embedded systems. Its assembler is RISC (Reduced Instruction Set Computer) style, which means a smaller and more uniform instruction set, but just as powerful.

  • MIPS: Another RISC architecture, classic in university computer architecture teaching and present in many embedded systems.

  • RISC-V: The open‑source project that is gaining ground as a free alternative to ARM and x86. Its assembler is increasingly relevant in academia and experimental hardware.

  • z/Architecture (S/390): The assembler of IBM mainframes, essential in the financial and government sectors.

  • PowerPC: An architecture that was famous in sixth‑ and seventh‑generation consoles and old Macs, now more relegated to embedded systems.

In addition to this classification by architecture, assemblers are also categorized by their style and features:

  • Flat Assembler: Direct code, no additional abstractions. Common in bootloaders and very basic firmware.

  • Macro Assembler: Includes a macro system that allows defining reusable code blocks, conditional abstractions, and repetitive code generation. Most modern assemblers are macro assemblers.

  • High Level Assembler (HLA): Mixes low‑level syntax with structures from high‑level languages (like while loops or if/else statements), making it easier to learn.

  • Cross Assembler: An assembler that runs on one platform (e.g., a Windows PC) but generates machine code for another architecture (e.g., an ARM microcontroller). It is the standard tool in embedded systems development.


Assembly tools: the low‑level programmer's arsenal

Over the decades, many tools have emerged for working with Assembly, each with its own strengths and legacies.

  • NASM (Netwide Assembler): Probably the most popular among operating system developers and x86 enthusiasts. It is cross‑platform, compatible with Intel and AMD64, and has a clean syntax that many prefer over other assemblers. Its ability to produce multiple output formats makes it very versatile. According to a 2025 list of tools, NASM stands out for its flexibility and support for multiple output formats.

  • MASM (Microsoft Macro Assembler): Microsoft's veteran for the Windows ecosystem. With deep integration into Visual Studio, it remains the choice for developing device drivers and low‑level libraries for Windows.

  • GAS (GNU Assembler): The assembler from the GNU suite. It is the default on Linux systems and cross‑platform development. It uses AT&T syntax by default, which can be strange for those coming from NASM or MASM, but it is extremely powerful and available on practically any Unix‑like system.

  • FASM (Flat Assembler): An assembler known for its speed and for being self‑compilable (it is written in itself). Its minimalist philosophy and ability to generate very small executables make it a favorite in certain scenes of the demoscene and malware development (for better or worse).

  • TASM (Turbo Assembler): A classic from Borland, still used in the maintenance of DOS and 16‑bit Windows systems. Its relevance today is almost purely historical.

  • Keil µVision: A professional IDE focused on ARM microcontrollers. It is the de facto standard in many real‑time engineering and embedded systems projects.

In terms of development environments, tools like RadASM provide a full IDE with syntax highlighting and an integrated debugger. For debugging and binary analysis, OllyDbg and x64dbg are essential in reverse engineering tasks, as they allow viewing and modifying code at runtime.

The following diagram gives an overview of the modern workflow in Assembly development:

flowchart TD
    A[Code editor\nIDE or plain text editor] --> B[Assembler\nNASM, MASM, FASM, GAS]
    B --> C{Linker needed?}
    C -->|Yes| D[Linker\nLD, LINK.exe]
    C -->|No| E[Debugger\nGDB, OllyDbg]
    D --> E
    E --> F[Testing and verification]
    F -->|Error| A
    F -->|Success| G[Executable or library\n.bin, .exe, .dll, .o, .lib]

The flow shows how code is assembled, linked (if necessary), debugged, and tested in a cycle that can be iterative. Unlike high‑level languages, debugging at the instruction and memory level is a fundamental part of the process.


Assembly in 2026: where does the oldest language hide?

Far from being a dead language, Assembly remains indispensable in several high‑value technology niches.

Embedded systems and microcontrollers: The vast majority of microcontrollers in washing machines, cars, pacemakers, and IoT devices run a combination of C and Assembly. Bootloaders, real‑time interrupts, and access to specific registers are often written directly in Assembly. Home AI virtual assistants still rely on a software stack that, at its lowest layers, uses Assembly.

Mainframes: This is perhaps the most surprising example. Large banks, insurance companies, and government agencies still use IBM mainframe systems. Their transactional cores, which process millions of operations per second, contain huge amounts of Assembly code written in the 1980s and 1990s. In 2026, a session at the GSE Nordic conference was titled "Programming Mainframe Assembler Today and in the future", discussing how financial institutions still value Assembly's efficiency while facing a critical shortage of programmers with these skills.

Extreme optimization: In fields such as high‑performance computing (HPC), graphics libraries (those behind game engines), and high‑frequency trading, every nanosecond counts. Although the norm is to write in C++ or Rust, critical sections are manually optimized in Assembly to exploit SIMD (Single Instruction, Multiple Data) instructions or to avoid certain compiler bottlenecks.

Databases and operating systems: The Linux kernel, BSD operating systems, and the fastest databases contain small portions of Assembly code for very low‑level tasks such as interrupt handling, task switching, and atomic operations.

Education: Assembly remains fundamental for teaching computer architecture. Virtually any computer science degree includes at least one course where students learn to program in MIPS, ARM, or x86 to understand how a CPU really works. Educational projects in 2026, such as building compilers that generate Assembly code, remain a central teaching tool.


The future of Assembly: three trends reinventing it

Three forces are shaping the future of Assembly in 2026.

1. Artificial intelligence as an automatic optimizer

The most promising trend is the application of AI to generate and optimize Assembly code. Researcher Daniel Lemire's 2026 experiment is paradigmatic. Starting from a C++ function that counted characters in a string (which executed about 1200 instructions), he asked an AI to rewrite the critical part in Assembly. After several iterations, the AI managed to reduce execution to only 154 instructions per string, almost eight times fewer. The generated code exploited SIMD and NEON instructions and aggressively reduced dependencies between operations.

This approach does not aim to replace the programmer, but to act as an optimization copilot. The developer writes in C++ or Rust, and the AI experiments with Assembly variants, tests them, and returns the fastest version, even along with the equivalent maintainable C++ code. This democratizes access to optimization techniques that were previously mastered only by a few experts, turning Assembly into an internal "implementation detail" that the AI handles for us, while humans focus on high‑level logic.

This trend is complemented by tools like LASM (presented in March 2026), which can automatically lift inline Assembly from C/C++ and convert it to LLVM IR, enabling whole‑program analysis and smoother integration with modern compilation tools.

2. Expansion of architectures: ARM64 and RISC‑V

The world is no longer just x86. Today any developer who wants to write low‑level code must consider at least three architectures: x86_64, ARM64, and RISC‑V. The first dominates servers and PCs, the second rules mobile and expands into the cloud with Apple M‑series chips and AWS Graviton instances, and the third emerges as the promise of completely open, patent‑free hardware. An LWN analysis in March 2026 noted that "Assembly seems more viable than in earlier times" precisely because of this architectural diversity.

This means that development teams will have to handle multiple assemblers and know the peculiarities of each platform. AI can help in this task of translating between architectures, becoming an automatic "cross‑assembly" tool.

3. New abstractions: "Augmented Assembly Language"

The concept of High Level Assembler is evolving toward more radical proposals, such as "Augmented Assembly Language" (Asm). This research, published in 2026, proposes adding flexible machine code descriptions, high‑level memory management directives, and custom lexical identification capabilities to the traditional assembler language, without losing its low‑level essence. The goal is to enable more concise and expressive code descriptions, adapting to present, emerging, or future systems.

These innovations suggest that Assembly will not disappear, but will transform into an increasingly sophisticated and accessible tool, in which AI and new abstractions bring low‑level programming closer to more developers.


Diagram: The current Assembly ecosystem

flowchart TD
    subgraph Ecosystem[Assemblers and their environment]
        A[High-level languages\nC, C++, Rust] --> B[Optimizing compilers\nGCC, LLVM, Clang]
        B --> C[Assemblers\nNASM, MASM, GAS, FASM]
        C --> D[Linkers\nLD, LINK.exe]
        D --> E[Machine code and libraries\n.exe, .dll, .so, .o]
        E --> F[CPU execution]
    end

    subgraph Architectures[Target architectures]
        G[x86/x86-64]
        H[ARM/ARM64]
        I[RISC-V]
        J[z/Architecture and PowerPC]
    end

    subgraph Future[Road ahead]
        K[AI optimization]
        L[Autonomous optimization agents]
        M[WebAssembly]
        N[Augmented ASM]
    end

    F --> G
    F --> H
    F --> I
    F --> J

    K --> L
    L --> B
    L --> C
    M --> B
    N --> C

This diagram shows the current workflow, target architectures, and the forces transforming Assembly in the present.


The connection with WebAssembly: a preview for next Thursday

We have talked about a low‑level language tied to physical architectures. But what happens if we try to bring Assembly's efficiency to the web, without being tied to a specific processor? That is the promise of WebAssembly, the topic of next Thursday's post.

WebAssembly (Wasm) is not an assembler in the classical sense. Its name is not accidental: it was chosen precisely to "look synonymous with classic assembly language", because the idea was to bring something similar to the web. But unlike x86 or ARM, Wasm is a low‑level language for an abstract virtual machine, the one your browser implements. It is a portable, safe binary format that runs inside a sandbox and can be compiled to native code by the browser at near‑hardware speeds.

The connection with Assembly is deeper than it seems. Many modern compilers (LLVM, for example) use a low‑level intermediate representation that can generate both traditional Assembly code and Wasm. People who understand Assembly can learn WebAssembly relatively easily, since the logic of memory management, virtual registers, and control flow is analogous. Moreover, the growing interest in AI and executing language models directly in the browser is making WebAssembly a priority compilation target for machine learning frameworks.

In the next post we will unravel in detail what WebAssembly is, why it is revolutionizing the web, and how it relates to the Assembly we have just studied.

The oldest language in software has not died. It has reinvented itself as a precision tool for the most demanding problems, while its spirit lives on in new forms like WebAssembly. Assembly is not a fossil. It is the foundation on which everything else is built.


References

Booth, K. H. V. (1947). Coding for A.R.C. Birkbeck College, University of London. [Via Wikipedia]

Campbell-Kelly, M. (1980). Programming the EDSAC: Early Programming Activity at the University of Cambridge. Annals of the History of Computing, 2(1), 7-36.

PhoenixNAP Global IT Services. (2025). What Is Assembly Language?. PhoenixNAP IT Glossary. https://phoenixnap.com/glossary/what-is-assembly-language

Titenko, A. I., & Zolotova, S. H. (n.d.). Assembly Language. Sumy State University.

GSE Nordic. (2026). Programming Mainframe Assembler Today and in the future. GSE Nordic Conference 2026, Helsinki. https://gse-nordic.org

Lemire, D. (2026). AI-generated assembly optimization experiment. [Via MundoBytes.com]

MundoBytes. (2026, April 14). Artificial intelligence to optimize assembly code. https://mundobytes.com

LASM Project. (2026, March 26). LASM: Automatically Lift x86 Inline Assembly for Whole Program Analysis. CRAD, ICT Academy. https://crad.ict.ac.cn

Asm Project. (2026). Augmented Assembly Language. [Via Academia.edu]

Mubbshira, P. (2025). Top 10 Best Assembly Language Tools for Developers in 2025. LinkedIn. https://www.linkedin.com

Quantum Zeitgeist. (2024, August 16). What Happened To Assembly Language? Do We Need It Anymore?. https://quantumzeitgeist.com

LWN.net. (2025, March 11). Assembly language?. https://lwn.net

dskoll. (2025, March 13). Assembly language? (Comment). LWN.net. https://lwn.net

Wikipedia. (2024). Assembly language. Wikimedia Foundation. https://en.wikipedia.org/wiki/Assembly_language

Wikipedia. (2024). WebAssembly. Wikimedia Foundation. https://en.wikipedia.org/wiki/WebAssembly

World Wide Web Consortium (W3C). (2019). WebAssembly Core Specification. https://www.w3.org/TR/wasm-core-1/

0 Like 0 Dislike 0 total

Loading reactions...

Comments (0)

Loading session...

No comments yet. Be the first to comment.

Back to all posts