Modos de endereçamento da memória
Explore diferentes maneiras de acessar posições de memória usando modos de endereçamento direto, indireto, de base, de índice e de índice escalado.
Modos de endereçamento da memória é uma aula grátis de Assembly Language & x86 Low-Level Systems Programming no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Assembly Language & x86 Low-Level Systems Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Assembly Language & x86 Low-Level Systems Programming inclui 4 aulas no total.
Partes desta aula ainda não foram traduzidas e aparecem em inglês.
Memory's Many Paths
Welcome! Today, we'll learn how your CPU finds data in memory. This is crucial for understanding how programs work at a low level.
Memory addressing modes are the different ways a CPU can calculate the effective memory address of an operand.
- They allow flexible access to data.
- They're key for arrays, structures, and dynamic data.
Direct Addressing: Fixed Spots
Direct addressing is the simplest way to access memory. You provide the exact, fixed address of the data you want.
Think of it like going to a specific house number on a street. It's straightforward but not very flexible if you need to access different houses dynamically.
Try running this example:
section .data
; Define a word (2-byte) variable at a specific label
my_data dw 0x1234
section .text
global _start
_start:
; Move the content of 'my_data' into the AX register
; The CPU directly accesses the address associated with 'my_data'
mov ax, [my_data]
; Exit program (Linux specific syscall)
mov eax, 1 ; syscall number for exit
xor ebx, ebx ; exit code 0
int 0x80 ; call kernelRegister Indirect: Flexible Pointers
Register indirect addressing uses a general-purpose register (like EBX, ESI, or EDI) to hold the memory address.
Instead of a fixed address, the register acts as a 'pointer' to the data. This is much more flexible, as you can change the register's value to point to different memory locations.
Here's an example:
section .data
; Define some data in memory
value1 dw 0xAABB
value2 dw 0xCCDD
section .text
global _start
_start:
; Load the address of 'value1' into EBX
mov ebx, value1
; Move the content pointed to by EBX into AX
mov ax, [ebx] ; AX now holds 0xAABB
; Change EBX to point to 'value2'
mov ebx, value2
; Move the content pointed to by EBX into DX
mov dx, [ebx] ; DX now holds 0xCCDD
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80Base Addressing: Structured Access
Base addressing combines a base register (often EBX or EBP) with a fixed numerical displacement (offset).
This is extremely useful for accessing fields within a data structure or elements of an array when the base address of the structure/array is in the register.
Example:
section .data
; A 'structure' with two word members
my_struct:
member1 dw 0x1111
member2 dw 0x2222
section .text
global _start
_start:
; Load the base address of 'my_struct' into EBX
mov ebx, my_struct
; Access 'member1' (offset 0 from base)
mov ax, [ebx + 0] ; AX now holds 0x1111
; Access 'member2' (offset 2 bytes from base, as words are 2 bytes)
mov dx, [ebx + 2] ; DX now holds 0x2222
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80Index Addressing: Array Iteration
Index addressing uses an index register (like ESI or EDI) plus a displacement.
This mode is perfect for iterating through array elements, where the displacement can be the starting address of the array and the index register holds the current element's offset.
Consider this:
section .data
; An array of words
my_array dw 10h, 20h, 30h, 40h
section .text
global _start
_start:
; Set ESI to 0 (first element offset)
mov esi, 0
; Access first element: my_array[0]
mov ax, [my_array + esi] ; AX = 10h
; Increment ESI to point to the next word (2 bytes)
add esi, 2
; Access second element: my_array[1]
mov bx, [my_array + esi] ; BX = 20h
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80Base-Index: 2D Arrays & More
Base-index addressing combines a base register and an index register (with an optional displacement).
This is powerful for accessing elements in two-dimensional arrays, or arrays of structures. The base register might hold the start of a row, and the index register the column offset.
It looks like [base + index] or [displacement + base + index].
section .data
; A 2x2 array of words (each row is 4 bytes: 2 words * 2 bytes/word)
matrix dw 1, 2 ; Row 0
dw 3, 4 ; Row 1
section .text
global _start
_start:
; EBX holds the base address of the matrix
mov ebx, matrix
; Access element [0][0]: (EBX + ESI)
mov esi, 0 ; Index for column 0
mov ax, [ebx + esi] ; AX = 1
; Access element [0][1]: (EBX + ESI)
mov esi, 2 ; Index for column 1 (1 word * 2 bytes/word)
mov bx, [ebx + esi] ; BX = 2
; Access element [1][0]: (EBX + displacement for row 1 + ESI)
; Row 1 starts 4 bytes after row 0
mov esi, 0
mov cx, [ebx + 4 + esi] ; CX = 3
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80Scaled-Index: Data Type Friendly
Scaled-index addressing is an extension of base-index, allowing you to multiply the index register by a scale factor (1, 2, 4, or 8).
This is incredibly useful when working with arrays of different data sizes (bytes, words, double words, quad words) because the CPU automatically calculates the correct offset.
Format: [base + index*scale + displacement]
section .data
; An array of double words (4 bytes each)
d_array dd 100h, 200h, 300h
section .text
global _start
_start:
; EBX holds the base address of the array
mov ebx, d_array
; Access d_array[0] (index 0, scale 4 for dword)
mov esi, 0
mov eax, [ebx + esi*4] ; EAX = 100h
; Access d_array[1] (index 1, scale 4 for dword)
mov esi, 1
mov ebx, [ebx + esi*4] ; EBX = 200h
; Access d_array[2] (index 2, scale 4 for dword)
mov esi, 2
mov ecx, [ebx + esi*4] ; ECX = 300h
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80The Constant: Displacement
You've seen the term 'displacement' pop up in several modes. A displacement is a constant, signed 8-bit, 16-bit, or 32-bit value that's added to the calculated address.
- It provides a fixed offset from a base or index.
- It's often used to access specific members within a structure or to jump to a certain point in an array.
- It can be positive or negative.
It acts like a fixed street number offset from a known starting point.
Choosing Your Addressing Mode
Which mode should you use?
- Direct: For fixed, known memory locations (e.g., global variables).
- Register Indirect: For pointers, dynamic memory access.
- Base/Index: For array iteration, accessing structure members.
- Scaled-Index: Best for arrays of different-sized data types, letting the CPU handle scaling.
Understanding these modes gives you powerful control over memory!
Addressing Mode Challenge
Test your knowledge on memory addressing modes!
Memory Paths Mastered
Great job! You've explored the fundamental x86 memory addressing modes:
- Direct: Fixed addresses.
- Register Indirect: Register as a pointer.
- Base: Base register + displacement.
- Index: Index register + displacement.
- Base-Index: Base + Index + optional displacement.
- Scaled-Index: Base + Index * Scale + optional displacement.
These modes are the building blocks for how your programs interact with data in memory. Keep practicing!
Aprenda Assembly com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 12
- Aulas
- 48
Perguntas Frequentes
A aula “Modos de endereçamento da memória” é grátis?
Sim — o texto completo de “Modos de endereçamento da memória” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Assembly Language & x86 Low-Level Systems Programming, atualize para CoddyKit PRO. O curso de Assembly Language & x86 Low-Level Systems Programming inclui 4 aulas no total.
O que vou aprender em “Modos de endereçamento da memória”?
Explore diferentes maneiras de acessar posições de memória usando modos de endereçamento direto, indireto, de base, de índice e de índice escalado. Você pratica Assembly Language & x86 Low-Level Systems Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Assembly Language & x86 Low-Level Systems Programming?
Nenhuma experiência prévia é necessária. Assembly Language & x86 Low-Level Systems Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Modos de endereçamento da memória”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Assembly Language & x86 Low-Level Systems Programming?
Sim. Cada aula de Assembly Language & x86 Low-Level Systems Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Desmistificando os registradores x86
- Modos de endereçamento da memória
- Representação e tipos de dados
- O registrador FLAGS e os bits de estado