Menu
Coddy logo textTech

LEA - Carregar Endereço

Parte da seção Fundamentos do Journey de Assembly da Coddy. Lição 19 de 45.

Até agora, você usou mov para carregar valores da memória para os registradores. Mas, às vezes, você não quer o valor. Você quer o próprio endereço.

LEA significa Carregar Endereço Efetivo. Ele calcula um endereço de memória e coloca esse endereço em um registrador, sem acessar a memória.

Sintaxe:

lea register, [address]

MOV vs LEA:

InstruçãoO que ela faz
mov al, [number]Vai à memória, obtém o valor armazenado e o coloca em al
lea rsi, [number]NÃO vai à memória. Calcula o endereço de number e o coloca em rsi

Pense desta forma:

  • mov = abra a caixa e pegue o que está dentro
  • lea = anote o número da caixa (endereço) em um pedaço de papel

Exemplo:

number db 42        ; O valor 42 é armazenado em algum endereço

mov al, [number]    ; al = 42 (o valor)
lea rsi, [number]   ; rsi = endereço de number (ex.: 0x402000)

Por que você precisa de LEA?

Em assembly, quando você quer imprimir uma string ou passar um endereço de memória para uma função, precisa do endereço, não do valor. A syscall write (que você aprenderá no Capítulo 5) espera um endereço em rsi.

O que LEA pode fazer (além de endereços simples):

LEA também pode fazer operações matemáticas básicas com endereços. Por exemplo:

lea rsi, [number + 5]   ; rsi = endereço de number + 5 bytes

Isso é útil para trabalhar com arrays e estruturas de dados.

challenge icon

Desafio

Escreva uma linha de assembly para carregar o endereço de message no registrador rsi.

Experimente você mesmo

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; A instrução lea do aluno é executada primeiro
    ; rsi deve agora conter o endereço de message
    
    ; Imprime o prefixo
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Imprime a string usando o endereço que o aluno carregou
    mov rax, 1
    mov rdi, 1
    ; rsi já tem o endereço (do código do aluno)
    mov rdx, 6                    ; "Hello" + newline = 6 bytes
    syscall
    
    ; Sair
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Playground de Assembly