LEA - Cargar dirección
Parte de la sección Fundamentos del Journey de Assembly de Coddy — lección 19 de 45.
Hasta ahora, has usado mov para cargar valores desde la memoria en los registros. Pero a veces no quieres el valor — quieres la dirección en sí misma.
LEA significa Load Effective Address. Calcula una dirección de memoria y coloca esa dirección en un registro, sin acceder a la memoria.
Sintaxis:
lea register, [address]MOV vs LEA:
| Instrucción | Qué hace |
|---|---|
mov al, [number] | Va a la memoria, obtiene el valor de su interior y lo pone en al |
lea rsi, [number] | NO va a la memoria. Calcula la dirección de number y la pone en rsi |
Piénsalo de esta manera:
mov= abre la caja y toma lo que hay dentrolea= anota el número de la caja (dirección) en un trozo de papel
Ejemplo:
number db 42 ; El valor 42 se almacena en alguna dirección
mov al, [number] ; al = 42 (el valor)
lea rsi, [number] ; rsi = dirección de number (por ejemplo, 0x402000)¿Por qué necesitas LEA?
En ensamblador, cuando quieres imprimir una cadena o pasar una ubicación de memoria a una función, necesitas la dirección, no el valor. La syscall write (que aprenderás en el Capítulo 5) espera una dirección en rsi.
Lo que LEA puede hacer (más allá de direcciones simples):
LEA también puede realizar operaciones matemáticas básicas con direcciones. Por ejemplo:
lea rsi, [number + 5] ; rsi = dirección de number + 5 bytesEsto es útil para trabajar con arreglos y estructuras de datos.
Desafío
Escribe una línea de ensamblador para cargar la dirección de message en el registro rsi.
Pruébalo tú mismo
section .data
msg_prefix db 'message = '
prefix_len equ $ - msg_prefix
section .text
global _start
_start:
; La instrucción lea del estudiante se ejecuta primero
; rsi ahora debería contener la dirección de message
; Imprimir prefijo
mov rax, 1
mov rdi, 1
mov rsi, msg_prefix
mov rdx, prefix_len
syscall
%include "solution.asm"
; Imprimir la cadena usando la dirección que el estudiante cargó
mov rax, 1
mov rdi, 1
; rsi ya tiene la dirección (del código del estudiante)
mov rdx, 6 ; "Hello" + nueva línea = 6 bytes
syscall
; Salir
mov rax, 60
mov rdi, 0
syscallEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1La máquina
¿Qué es la CPU?MemoriaRegistros vs. MemoriaCómo funcionan las instruccionesPatrón de dos archivosLa arquitectura x86-643Primera instrucción - MOV
¿Qué es MOV?MOV InmediatoMOV de Registro a RegistroMOV de Memoria a RegistroMOV de Registro a MemoriaLEA - Cargar direcciónMOV con diferentes tamañosPráctica: Intercambiar registrosResumen: Desafío MOV