Menu
Coddy logo textTech

LEA — загрузка адреса

Часть раздела Основы путешествия по Assembly на Coddy — урок 19 из 45.

До сих пор вы использовали mov для загрузки значений из памяти в регистры. Но иногда вам нужно не значение — вам нужен сам адрес.

LEA расшифровывается как Load Effective Address (загрузка эффективного адреса). Она вычисляет адрес памяти и помещает этот адрес в регистр, не обращаясь к самой памяти.

Синтаксис:

lea register, [address]

MOV против LEA:

ИнструкцияЧто она делает
mov al, [number]Обращается к памяти, извлекает находящееся внутри значение и помещает его в al
lea rsi, [number]НЕ обращается к памяти. Вычисляет адрес number и помещает его в rsi

Представьте это так:

  • mov = открыть коробку и взять то, что внутри
  • lea = записать номер коробки (адрес) на листке бумаги

Пример:

number db 42        ; Значение 42 хранится по некоторому адресу

mov al, [number]    ; al = 42 (значение)
lea rsi, [number]   ; rsi = адрес number (например, 0x402000)

Зачем нужна LEA?

В ассемблере, когда вы хотите вывести строку или передать адрес памяти в функцию, вам нужен адрес, а не значение. Системный вызов write (о котором вы узнаете в главе 5) ожидает адрес в rsi.

Что может делать LEA (помимо простых адресов):

LEA также может выполнять базовые математические операции с адресами. Например:

lea rsi, [number + 5]   ; rsi = адрес number + 5 байт

Это полезно для работы с массивами и структурами данных.

challenge icon

Задание

Напишите одну строку на ассемблере, чтобы загрузить адрес message в регистр rsi.

Попробуйте сами

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; Инструкция lea студента выполняется первой
    ; rsi теперь должен содержать адрес message
    
    ; Печать префикса
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Печать строки с использованием адреса, загруженного студентом
    mov rax, 1
    mov rdi, 1
    ; rsi уже содержит адрес (из кода студента)
    mov rdx, 6                    ; "Hello" + новая строка = 6 байт
    syscall
    
    ; Выход
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы