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 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ónQué 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 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 (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 bytes

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

challenge icon

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
    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