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ção | O 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á dentrolea= 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 bytesIsso é útil para trabalhar com arrays e estruturas de dados.
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
syscallEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-64Pratique por conta própria: Playground de Assembly