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 endereço em si.

LEA significa Load Effective Address. 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 faz
mov al, [number]Vai até a memória, obtém o valor contido nela e o coloca em al
lea rsi, [number]NÃO vai até a memória. Calcula o endereço de number e o coloca em rsi

Pense nisso 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 da LEA?

Em assembly, quando você quer imprimir uma string ou passar um local de memória para uma função, você 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 o LEA pode fazer (além de endereços simples):

O LEA também pode fazer cálculos matemáticos básicos 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
    
    ; Imprimir prefixo
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Imprimir a string usando o endereço que o aluno carregou
    mov rax, 1
    mov rdi, 1
    ; rsi já possui o endereço (do código do aluno)
    mov rdx, 6                    ; "Hello" + nova linha = 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