Introduction of Assembler
Last Updated :
11 Jul, 2025
Assembler is a program for converting instructions written in low-level assembly code into relocatable machine code and generating along information for the loader. It is necessary to convert user-written programs into machinery code. This is called a translation of a high-level language to a low-level that is machinery language. This type of translation is performed with the help of system software. An Assembler can be defined as a program that translates an assembly language program into a machine language program. Self-assembler is a program that runs on a computer and produces the machine codes for the same computer or same machine. It is also known as a resident assembler. A cross-assembler is an assembler that runs on a computer and produces machine codes for other computers.

Types of Assembler
The assembler generates instructions by evaluating the mnemonics (symbols) in the operation field and finding the value of symbols and literals to produce machine code. On the basis of this functionality, assembler has two types:
- Single-Pass Assembler: If an assembler does all this work in one scan then it is called a single-pass assembler.
- Multiple-Pass Assembler: If it does it in multiple scans then called a multiple-pass assembler.
Working of Assembler
Assembler divides tasks into two passes:
Pass-1
- Define symbols and literals and remember them in the symbol table and literal table respectively.
- Keep track of the location counter.
- Process pseudo-operations.
- Defines a program that assigns the memory addresses to the variables and translates the source code into machine code.
Pass-2
- Generate object code by converting symbolic op-code into respective numeric op-code.
- Generate data for literals and look for values of symbols.
- Defines a program that reads the source code two times.
- It reads the source code and translates the code into object code.
Firstly, We will take a small assembly language program to understand the working in their respective passes. Assembly language statement format:
[Label] [Opcode] [operand]
Example: M ADD R1, ='3'
where, M - Label; ADD - symbolic opcode;
R1 - symbolic register operand; (='3') - Literal
Assembly Program:
Label Op-code operand LC value(Location counter)
JOHN START 200
MOVER R1, ='3' 200
MOVEM R1, X 201
L1 MOVER R2, ='2' 202
LTORG 203
X DS 1 204
END 205
Let's take a look at how this program is working:
- START: This instruction starts the execution of the program from location 200 and the label with START provides a name for the program. (JOHN is the name of the program).
- MOVER: It moves the content of literal(='3') into register operand R1.
- MOVEM: It moves the content of the register into memory operand(X).
- MOVER: It again moves the content of literal(='2') into register operand R2 and its label is specified as L1.
- LTORG: It assigns an address to literals(current LC value).
- DS(Data Space): It assigns a data space of 1 to Symbol X.
- END: It finishes the program execution.
Working of Pass-1
Define Symbols and literal tables with their addresses. Note: Literal address is specified by LTORG or END.
Step-1: START 200
(here no symbol or literal is found so both table would be empty)
Step-2: MOVER R1, ='3' 200
( ='3' is a literal so a literal table is made)
Step-3: MOVEM R1, X 201
X is a symbol referred before its declaration so it is stored in the symbol table with a blank address field.
Step-4: L1 MOVER R2, ='2' 202
L1 is a label and ='2' is a literal so store them in respective tables
Symbol | Address |
---|
X | - - - |
L1 | 202 |
Literal | Address |
---|
='3' | - - - |
='2' | - - - |
Step-5: LTORG 203
Assign an address to the first literal specified by LC value, i.e., 203
Literal | Address |
---|
='3' | 203 |
='2' | - - - |
Step-6: X DS 1 204
It is a data declaration statement i.e. X is assigned a data space of 1. But X is a symbol that was referred to earlier in step 3 and defined in step 6. This condition is called a Forward Reference Problem where the variable is referred prior to its declaration and can be solved by back-patching. So now the assembler will assign X the address specified by the LC value of the current step.
Step-7: END 205
The program finishes execution and the remaining literal will get the address specified by the LC value of the END instruction. Here is the complete symbol and literal table made by pass-1 of the assembler.
Literal | Address |
---|
='3' | 203 |
='2' | 205 |
Now tables generated by pass 1 along with their LC value will go to pass 2 of the assembler for further processing of pseudo-opcodes and machine op-codes.
Working of Pass-2
Pass-2 of the assembler generates machine code by converting symbolic machine-opcodes into their respective bit configuration(machine understandable form). It stores all machine-opcodes in the MOT table (op-code table) with symbolic code, their length, and their bit configuration. It will also process pseudo-ops and will store them in the POT table(pseudo-op table). Various Databases required by pass-2:
1. MOT table(machine opcode table)
2. POT table(pseudo opcode table)
3. Base table(storing value of base register)
4. LC ( location counter)
Take a look at the flowchart to understand:

As a whole assembler works as:

Conclusion
Assembler is a program that converts Assembly Language into machine language. There are two types of assemblers on the basis of a number of phases used to convert to machine code.
- One-Pass Assembler.
- Multi-Pass or Two-Pass Assembler.
One-Pass Assembler converts the whole conversion of assembly code into machine code in one pass or one go. On the other hand, Multi-Pass-Assembler takes multiple passes to convert assembly code into machine language.
Similar Reads
Introduction of Compiler Design A compiler is software that translates or converts a program written in a high-level language (Source Language) into a low-level language (Machine Language or Assembly Language). Compiler design is the process of developing a compiler.The development of compilers is closely tied to the evolution of
9 min read
Compiler Design Basics
Introduction of Compiler DesignA compiler is software that translates or converts a program written in a high-level language (Source Language) into a low-level language (Machine Language or Assembly Language). Compiler design is the process of developing a compiler.The development of compilers is closely tied to the evolution of
9 min read
Compiler construction toolsThe compiler writer can use some specialized tools that help in implementing various phases of a compiler. These tools assist in the creation of an entire compiler or its parts. Some commonly used compiler construction tools include: Parser Generator - It produces syntax analyzers (parsers) from the
4 min read
Phases of a CompilerA compiler is a software tool that converts high-level programming code into machine code that a computer can understand and execute. It acts as a bridge between human-readable code and machine-level instructions, enabling efficient program execution. The process of compilation is divided into six p
10 min read
Symbol Table in CompilerEvery compiler uses a symbol table to track all variables, functions, and identifiers in a program. It stores information such as the name, type, scope, and memory location of each identifier. Built during the early stages of compilation, the symbol table supports error checking, scope management, a
8 min read
Error Handling in Compiler DesignDuring the process of language translation, the compiler can encounter errors. While the compiler might not always know the exact cause of the error, it can detect and analyze the visible problems. The main purpose of error handling is to assist the programmer by pointing out issues in their code. E
5 min read
Language Processors: Assembler, Compiler and InterpreterComputer programs are generally written in high-level languages (like C++, Python, and Java). A language processor, or language translator, is a computer program that convert source code from one programming language to another language or to machine code (also known as object code). They also find
5 min read
Generation of Programming LanguagesProgramming languages have evolved significantly over time, moving from fundamental machine-specific code to complex languages that are simpler to write and understand. Each new generation of programming languages has improved, allowing developers to create more efficient, human-readable, and adapta
6 min read
Lexical Analysis
Introduction of Lexical AnalysisLexical analysis, also known as scanning is the first phase of a compiler which involves reading the source program character by character from left to right and organizing them into tokens. Tokens are meaningful sequences of characters. There are usually only a small number of tokens for a programm
6 min read
Flex (Fast Lexical Analyzer Generator)Flex (Fast Lexical Analyzer Generator), or simply Flex, is a tool for generating lexical analyzers scanners or lexers. Written by Vern Paxson in C, circa 1987, Flex is designed to produce lexical analyzers that is faster than the original Lex program. Today it is often used along with Berkeley Yacc
7 min read
Introduction of Finite AutomataFinite automata are abstract machines used to recognize patterns in input sequences, forming the basis for understanding regular languages in computer science. They consist of states, transitions, and input symbols, processing each symbol step-by-step. If the machine ends in an accepting state after
4 min read
Classification of Context Free GrammarsA Context-Free Grammar (CFG) is a formal rule system used to describe the syntax of programming languages in compiler design. It provides a set of production rules that specify how symbols (terminals and non-terminals) can be combined to form valid sentences in the language. CFGs are important in th
4 min read
Ambiguous GrammarContext-Free Grammars (CFGs) is a way to describe the structure of a language, such as the rules for building sentences in a language or programming code. These rules help define how different symbols can be combined to create valid strings (sequences of symbols).CFGs can be divided into two types b
7 min read
Syntax Analysis & Parsers
Syntax Directed Translation & Intermediate Code Generation
Syntax Directed Translation in Compiler DesignSyntax-Directed Translation (SDT) is a method used in compiler design to convert source code into another form while analyzing its structure. It integrates syntax analysis (parsing) with semantic rules to produce intermediate code, machine code, or optimized instructions.In SDT, each grammar rule is
8 min read
S - Attributed and L - Attributed SDTs in Syntax Directed TranslationIn Syntax-Directed Translation (SDT), the rules are those that are used to describe how the semantic information flows from one node to the other during the parsing phase. SDTs are derived from context-free grammars where referring semantic actions are connected to grammar productions. Such action c
4 min read
Parse Tree and Syntax TreeParse Tree and Syntax tree are tree structures that represent the structure of a given input according to a formal grammar. They play an important role in understanding and verifying whether an input string aligns with the language defined by a grammar. These terms are often used interchangeably but
4 min read
Intermediate Code Generation in Compiler DesignIn the analysis-synthesis model of a compiler, the front end of a compiler translates a source program into an independent intermediate code, then the back end of the compiler uses this intermediate code to generate the target code (which can be understood by the machine). The benefits of using mach
6 min read
Issues in the design of a code generatorA code generator is a crucial part of a compiler that converts the intermediate representation of source code into machine-readable instructions. Its main task is to produce the correct and efficient code that can be executed by a computer. The design of the code generator should ensure that it is e
7 min read
Three address code in CompilerTAC is an intermediate representation of three-address code utilized by compilers to ease the process of code generation. Complex expressions are, therefore, decomposed into simple steps comprising, at most, three addresses: two operands and one result using this code. The results from TAC are alway
6 min read
Data flow analysis in CompilerData flow is analysis that determines the information regarding the definition and use of data in program. With the help of this analysis, optimization can be done. In general, its process in which values are computed using data flow analysis. The data flow property represents information that can b
6 min read
Code Optimization & Runtime Environments
Practice Questions