Menu
Coddy logo textTech

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

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

До сих пор вы использовали mov, чтобы загружать значения из памяти в регистры. Но иногда вам нужно не значение. Вам нужен сам address.

LEA означает Load Effective Address. Он вычисляет адрес памяти и помещает этот адрес в register, не обращаясь к памяти.

Синтаксис:

lea register, [address]

MOV vs LEA:

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

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

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

Пример:

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

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

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

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

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

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

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

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

challenge icon

Задание

Напиши одну строку на языке assembly, чтобы загрузить адрес 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" + newline = 6 байт
    syscall
    
    ; Выход
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Песочница Assembly