LEA and addressing modes

LEA basics

LEA (Load Effective Address) computes an address and puts it in a register without reading memory. Its bracket syntax is the full x86 addressing grammar:

lea rax, [buf] ; address of buf lea rax, [buf+8] ; address plus 8 lea rax, [rbx+rcx*4] ; base + index*scale

Addressing modes

A memory operand is base plus index times scale plus displacement: [base + index*scale + disp]. Scale is 1, 2, 4, or 8, and matches the element size of an array:

mov eax, [table + rsi*4] ; table[rsi] of 32-bit ints mov al, [grid + rdi*8 + rsi] ; row rdi, column rsi

The arithmetic trick

Because LEA only computes addresses, it also does fast arithmetic: LEA rax, [rax+rax*2] is rax times 3 in one instruction, with no flags changed. Compilers use this trick constantly, so you will see it in every disassembly.

Next: Memory layout: sections

Article author: Arthur Isaev