Indirect Addressing Mode: Effective Address Calculation

Indirect Addressing Mode: Effective Address Calculation

Verified Sources
Nov 4, 2026

Indirect address mode is a form of addressing mode in which the instruction first obtains an address (a pointer) and then uses that pointer to locate the actual operand in memory.

A useful way to reason about this is to distinguish two steps:

  1. Compute a pointer address (often just the contents of a register or a computed memory location).
  2. Dereference that pointer by performing a second memory access to obtain the effective address of the data.

In notation often used in computer architecture texts, the indirect addressing effective address can be described as:

  • If the pointer is stored in memory at address AA, then EA=M[A]EA = M[A].
  • If the pointer is stored in a register RR, then EA=M[R]EA = M[R].

The core intuition: the register or intermediate memory location does not directly point to the data; it points to another location that ultimately contains the data or its address. (This yields an extra memory reference relative to direct addressing.)

To visualize the dereference, consider this generic indirect flow:

Key terms you’ll see: effective address (EA), dereference, pointer, memory reference.

Indirect Addressing Mode Explained (Pointer/Dereference Intuition)

Effective Address (EA) formulas for common indirect forms

Indirect addressing appears in multiple syntactic/ISA flavors, but the effective-address principle is consistent: EAEA is obtained by one dereference of a pointer value.

Below are the most common patterns used in architecture and assembly-logic explanations:

1) Register Indirect

  • Pointer comes from a register: EA=M[R]EA = M[R]
  • Here, RR holds a pointer (an address), and indirect addressing dereferences it once to get the final data location.

2) Memory Indirect

  • Pointer comes from a memory location: EA=M[M[A]]EA = M[M[A]]
  • Here, AA is an address where a pointer is stored; you dereference that memory cell to retrieve another address, and then (conceptually) that retrieved address is used as the effective address.

3) Indirect with displacement / indexed variants

Some instruction sets combine indirect concepts with an added displacement or index before dereferencing:

  • Pointer address first: A=(R+d)A = (R + d) (or other base/index expression)
  • Then: EA=M[A]EA = M[A]

So even when there’s an arithmetic step, indirect addressing still has the same hallmark:

The instruction performs (at least) one extra memory access to follow the pointer.

Mental model

Think “operand = pointer”. Indirect addressing uses the operand as a pointer (address), then dereferences it to reach the true data location.

Common confusion: what’s stored where?

In indirect mode, the register (or first memory cell) usually stores an address, not the data itself. The data lives at the address contained in that pointer.

Calculating Effective Address (EA) in Indirect Addressing

  1. 1
    Step 1

    Determine whether the pointer is taken from a register (e.g., RR) or from a memory address (e.g., AA).

  2. 2
    Step 2

    If the ISA uses base/index/displacement, compute the intermediate address AA (example pattern: A=R+dA = R + d).

  3. 3
    Step 3

    Read memory to obtain the pointer value and set EAEA using the indirect rule (common patterns: if pointer in register then EA=M[R]EA = M[R]; if pointer in memory then EA=M[A]EA = M[A]).

  4. 4
    Step 4

    Finally, read or write the actual data at address EAEA.

Worked example: Register indirect

Assume:

  • Register R=200R = 200
  • Memory contents: M[200]=600M[200] = 600
  • Then indirect addressing implies:
    • Pointer value is M[R]=M[200]=600M[R] = M[200] = 600
    • Effective address is EA=600EA = 600
    • The operand is located at M[EA]=M[600]M[EA] = M[600]

This can be summarized as: EA=M[R]⇒EA=M[200]=600EA = M[R] \quad \Rightarrow \quad EA = M[200] = 600

Worked example: Memory indirect

Assume:

  • Intermediate address A=300A = 300
  • Pointer stored at that memory address: M[300]=700M[300] = 700
  • Then: EA=M[A]=M[300]=700EA = M[A] = M[300] = 700 and the operand is found at M[700]M[700].

Why it matters (performance implications)

Because indirect addressing typically requires an extra memory reference (dereference), it can increase latency relative to modes that access data directly. In a simple pipeline/memory model, this can add a dependency chain:

  • EA depends on the pointer load
  • operand depends on EA So the CPU may need to wait for the first memory read before it can complete the second. This is closely related to the concept of memory access latency, data dependency, and pointer chasing.

Indirect Addressing Lifecycle (Conceptual)

Read the operand form

1. Operand Interpretation

Determine whether the operand denotes a register-held pointer or a memory-held pointer."

Form the pointer location (if base/index/displacement exists)

2. Compute Intermediate Address

Compute intermediate address AA such that the pointer is stored at M[A]M[A] (or taken from RR)."

Fetch the pointer value

3. Dereference

Perform dereference: read M[A]M[A] (or dereference register value) to obtain EAEA."

Use EA to access operand

4. Data Access

Read/write the operand at the final effective address EAEA."

Summary table: indirect vs direct (EA rule focus)

ModeWhere the pointer/data comes fromTypical EA rule
Direct addressingOperand points directly to dataEA=AEA = A (or EA=REA = R depending on syntax)
Indirect addressingOperand provides a pointer to a location containing the real addressEA=M[A]EA = M[A] (or EA=M[R]EA = M[R])
Indirect (memory-held pointer)Pointer stored in memory at intermediate addressEA=M[M[A]]EA = M[M[A]] (conceptual chaining)

Key FAQs

Knowledge Check

Question 1 of 4
Q1Single choice

In register indirect addressing, which expression most accurately represents the effective address (EA)?