Menu
Coddy logo textTech

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ónQué 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 dentro
  • lea = 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 bytes

Esto es útil para trabajar con arrays y estructuras de datos.

challenge icon

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
    syscall
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos

Practica por tu cuenta: Playground de Assembly