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 байтЭто полезно для работы с массивами и структурами данных.
Задание
Напишите одну строку на ассемблере, чтобы загрузить адрес 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-64