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ção | O 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á 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 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 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
; 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
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-64