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 de la memoria en los registros. Pero a veces no quieres el valor. Quieres la dirección 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 frente a LEA:
| Instrucción | Qué hace |
|---|---|
mov al, [number] | Va a la memoria, obtiene el valor que hay dentro y lo coloca en al |
lea rsi, [number] | NO va a la memoria. Calcula la dirección de number y la coloca en rsi |
Piensa en ello así:
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 (p. ej., 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 llamada al sistema write (que aprenderás en el capítulo 5) espera una dirección en rsi.
Lo que LEA puede hacer (más allá de las direcciones simples):
LEA también puede hacer 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 arrays y estructuras de datos.
Desafío
Escribe una línea de assembly 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 debería contener ahora 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 cargó el estudiante
mov rax, 1
mov rdi, 1
; rsi ya tiene la dirección (del código del estudiante)
mov rdx, 6 ; "Hello" + newline = 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 MOVPractica por tu cuenta: Playground de Assembly